0

我正在编写一个具有 2 个模型的应用程序,用户和每日。每个用户都有_many 日报。我正在尝试每天午夜为每个用户创建每日报告。我如何在rails中做到这一点?在 Backbone 中,我只需找到从现在到午夜之间的时间,为该时间量设置超时,然后创建一个新模型,并递归调用该函数。我查看了Rails:在每天的特定时间重置模型属性,并看到了随时使用和 cron 的建议,但我不确定是否有更好的方法来完成我想要做的事情。

我想出的一个临时解决方案是,如果当前用户还没有包含今天日期的 Daily,则在用户访问主页时创建一个新 Daily。如果用户在当天访问主页,则存在仅创建一天报告的问题。如果用户在主页上导航,则不会创建报告,而且我认为在每个操作中都进行检查的解决方案过于侵入性。Rails 中有没有办法自动执行此任务?

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

4

2 回答 2

1

你应该看看 gem whenever

它允许您在这样的文件中以非常易读的 DSL 定义任务config/schedule.rb:(示例取自 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
于 2013-08-20T14:37:59.240 回答
0

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

于 2013-08-20T05:36:35.347 回答