如何在rails中建模和存储重复性任务?

时间:2009-07-21 04:05:07

标签: ruby-on-rails ruby calendar scheduling recurring

铁轨中的Cron解决方案众多且相当不错。那不是我在这里挣扎的。

相反,我遇到的麻烦就是让用户创建他们自己的重复任务(比如提醒) - 特别是如何在数据库中建模和存储这些任务(一个好的用户界面也是非常重要的 - 会很棒)如果那里有代码那么)。谷歌日历在这里是一个很好的例子(添加活动的UI,而不是整个日历)......他们应该能够在每天下午1点CST,或周一/周三/周五,或每周等等。无论cron解决方案是什么然后使用将需要轮询数据库以查看在那个时间需要发送哪些提醒等

有人在rails中看到过这个好的插件/宝石吗?似乎会有一些东西,但我还没有找到它。

谢谢!

4 个答案:

答案 0 :(得分:6)

我最终推出了自己的解决方案,因为我不需要任何超级幻想。

基本上我在数据库中添加了一个next_run日期时间和interval字符串列,该列是(日,周等)之一。然后设置一个cron作业来查找已经过去的任何next_run个日期。它运行它们,然后根据next_run列将interval设置为将来的某个点。

简单但符合我的需要。

答案 1 :(得分:1)

目前正在考虑使用这样的插件来存储表中的重复 http://github.com/fnando/recurrence/tree/master

每个提醒都有一个重复对象,提醒也会保留一个日期时间字段,当它应该发送它的下一个时。然后cron可以......

get all reminder's whose "next_send" date has passed
for each reminder
  send it
  update the "next_send" field using the recurrence object
end

如果有更好的解决方案,或者我走错了路,输入总是受到赞赏。

答案 2 :(得分:1)

我总是发现ical(RFC,而不是程序)解决方案是处理重复事件的最佳方法。有一些很好的Ruby库用于处理ical,而块上最新的孩子是ri_cal

答案 3 :(得分:0)

我目前遇到此问题,我正在考虑的解决方案如下:

class AllowReoccuringTasks < ActiveRecord::Migration  
    def self.up  
        add_column :tasks, :reoccuring, :boolean  
        add_column :tasks, :period, :integer  
    end
end

其中句点可以是1(每天),7(每周)或14(每隔一周)。

如果您想支持其他类型的计划,例如每个月,工作日,周末等,您可以改为添加一个名为“schedule”的列,并使用常量来表示不同的计划类型。您也可以使用enum plugin