使用rails每天自动创建模型实例

时间:2013-08-20 04:59:56

标签: ruby-on-rails ruby scheduled-tasks

我正在编写一个包含2个模型的应用程序,User和Daily。每个用户都有很多日常任务。我正在尝试每天午夜为每个用户创建每日报告。我如何在rails中执行此操作?在Backbone中,我只想找到从现在到午夜之间的时间,设置该时间的超时,然后创建一个新模型,并递归调用该函数。我看了Rails: Reset a model attribute at specific time each day并看到了随时随地使用cron的建议,但我不确定是否有更好的方法来完成我想要做的事情。

我想出的一个临时解决方案是,如果当前用户还没有今天的每日日期,则当用户访问主页时创建一个新的每日。如果用户在当天访问主页,则存在仅创建一天的报告的问题。如果用户在主页周围导航,则不会创建报告,并且我认为将检查放在每个操作中都是一种过于干扰的解决方案。有没有办法在rails中自动执行此任务?

编辑:我的另一个想法是将after_create放入我的Daily类,然后使用与我的Backbone解决方案相同的解决方案。这是实现这一目标的最佳方式吗?

2 个答案:

答案 0 :(得分:1)

你应该看看宝石whenever

它允许您在config/schedule.rb文件中以非常易读的DSL定义任务,如下所示:(来自gem自述文件的示例):

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 :(得分:0)

我认为这是一个后台或异步函数,因此最好不要将逻辑放在视图或客户端。这不可靠。最简单的方法是cron,但它依赖于操作系统。 Cron还有其他缺点。如果你想要纯红宝石解决方案,我建议宝石发条。查看详情:https://github.com/tomykaira/clockwork