如何自动更改数据库中的记录?

时间:2012-11-30 11:05:28

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

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

示例:当日期和时间是01/12/2012 17:15:00时,我希望某些记录自动设置为1.有没有解决方法?

(我正在使用Rails 3.2.6)

更新30.11.12 - 13:06

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

3 个答案:

答案 0 :(得分:4)

我可以在这里看到一些可能的选择。这取决于你的假设/约束。

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

1)数据库中的数据不需要正确,但下次有人查看数据时,我们会相应修复 2)数据库中的数据不需要是正确的,但是例如在可定义的时间间隔内 3)数据在任何时候都需要在数据库中正确

让我更详细地介绍一下

下次有人查看数据

时,数据显示正确

这实际上非常简单。检索要显示的数据时,检查某些条件/时间是否已经过去,并相应地设置标记。

对于用户来说,当标志设置正确时,它实际上是不相关的,但每次用户查看数据时,都会正确设置标志。

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

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

要完成此任务,您可以使用cron作业或像whenever

这样的宝石

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

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

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

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

  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,但也可以计算它应该执行的实际时间。

希望这有帮助。

答案 1 :(得分:0)

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

只要在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

答案 2 :(得分:0)

在linux服务器上使用cron job并为运行脚本设置时间