2

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

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

(我使用的是 Rails 3.2.6)

更新 30.11.12 - 13:06

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

4

3 回答 3

4

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

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

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

让我更详细地介绍这些

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

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

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

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

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

要做到这一点,您将使用 cron 作业或gem

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

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

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

或者,一个非常干净的解决方案是使用像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,但也可以计算应该执行的实际时间。

希望这可以帮助。

于 2012-11-30T12:35:21.973 回答
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
于 2012-11-30T11:12:20.773 回答
0

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

于 2012-11-30T12:12:07.137 回答