【问题标题】:How to automatically change record in database?如何自动更改数据库中的记录?
【发布时间】:2012-11-30 11:05:28
【问题描述】:

我需要在特定日期和时间自动更改数据库中的记录。

示例:当日期和时间为 01/12/2012 17:15:00 时,我希望将某些记录自动设置为 1。有什么解决方案吗?

(我使用的是 Rails 3.2.6)

更新 30.11.12 - 13:06

真正的问题是我的数据库中有一个日期时间记录,当该记录中的日期和时间超过今天的日期和时间时 - 然后我希望将另一条记录设置为 1。有什么办法可以制作if 声明,或者什么,在我的控制器的某个地方?

【问题讨论】:

    标签: ruby-on-rails database ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2


    【解决方案1】:

    我可以在这里看到一些可能的选项。这取决于您的假设/限制。

    可能的假设(按实施难度增加排序):

    1) 数据库中的数据不需要是正确的,但是下次有人查看数据时,我们会相应地对其进行修复 2)数据库中的数据不需要是正确的,但是例如在可定义的时间间隔内 3) 数据库中的数据需要始终正确

    让我更详细地介绍一下这些

    数据会显示正确,下次有人查看数据时

    这其实很简单。在检索要显示的数据时,检查某些条件/时间是否已经过去,并相应地设置标志。

    对于用户而言,正确设置标志实际上并不相关,但每次用户查看数据时,标志都会正确设置。

    在给定的时间间隔内数据将是正确的

    一个简单的案例是每小时检查一次,每半小时检查一次,每天检查一次,并设置或修复需要更改的项目的状态。

    要做到这一点,您可以使用 cron 作业或像 whenever 这样的 gem

    这是一种非常简单的方法,可以确保您的数据在可接受/给定的时间间隔内是正确的(如果您的问题当然有这样的时间间隔)。

    数据必须设置在正确的时间

    在这里我看到两个选项,对于需要在给定时间更改状态的每个项目,安排一个 任务使用与以前相同的选项:cron 或无论何时 gem。这可行,但我不完全确定 cron 是否是安排大量 1-off 作业的最佳解决方案。

    另外,一个非常干净的解决方案是使用像 DelayedJob 这样的 gem。这个 gem 主要用于将任务卸载到后台,例如对于需要更多时间处理的任务。但您也可以使用它在不久的将来,在非常特定的时间执行任务。

      def change_flag_when_needed
        # change the flag
      end
      # 5.minutes.from_now will be evaluated when change_flag_when_needed is called
      handle_asynchronously :in_the_future, :run_at => Proc.new { 5.minutes.from_now }
    

    无论何时调用change_flag_when_needed,它都会评估给定的块,该块现在包含5.minutes.from_now,但也可以计算应该执行它的实际时间。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答!我确实选择了whengege并且它起作用了,但我最终添加了一个endDate记录并结合了一个解决问题的长查询。
    【解决方案2】:

    您可以随时使用 https://github.com/javan/whenever 为您设置 cron 作业

    Whenever 在其schedule.rb 文件中有一个简单的语法,让您可以“随时随地”运行任务

    来自他们的自述文件:

    every 3.hours do
      runner "MyModel.some_process"
      rake "my:rake:task"
      command "/usr/bin/my_great_command"
    end
    
    every 1.day, :at => '4:30 am' do
      runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
    end
    
    every :hour do # Many shortcuts available: :hour, :day, :month, :year, :reboot
      runner "SomeModel.ladeeda"
    end
    
    every :sunday, :at => '12pm' do # Use any day of the week or :weekend, :weekday
      runner "Task.do_something_great"
    end
    
    every '0 0 27-31 * *' do
      command "echo 'you can use raw cron syntax too'"
    end
    
    # run this task only on servers with the :app role in Capistrano
    # see Capistrano roles section below
    every :day, :at => '12:20am', :roles => [:app] do
      rake "app_server:task"
    end
    

    【讨论】:

    • 好的,但真正的问题是我的数据库中有一个日期时间记录,当此记录中的日期和时间超过今天的日期和时间时 - 然后我希望将另一条记录设置为 1。有没有什么办法可以在我的控制器中的某处创建if 声明?
    • 否,因为控制器中的代码仅在网页被点击时运行
    【解决方案3】:

    在 linux 服务器上使用 cron 作业并设置运行脚本的时间

    【讨论】:

    • 尝试扩展您的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多