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

问题描述 投票:0回答:4

Rails 中的 Cron 解决方案很多而且非常好。这不是我在这里挣扎的问题。

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

有人在 rails 中看到过一个好的插件/gem 吗?好像会有一些东西在那里,但我还没有找到它。

ruby-on-rails ruby calendar scheduling recurring
4个回答
7
投票

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

基本上我在数据库中添加了一个

next_run
日期时间和
interval
字符串列,这是(天,周等)之一。然后设置一个 cron 作业来运行以查找任何已经过去的
next_run
日期。它运行它们,然后根据
next_run
列将
interval
设置为未来的某个时间点。

简单但能满足我的需要。


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

如果有更好的解决方案或者我走错了路,请随时提出意见。


1
投票

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


0
投票

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

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

周期可以是 1(每天)、7(每周)或 14(每隔一周)。

如果你想支持其他类型的时间表,如每月、工作日、周末等,你可以改为添加一个名为“时间表”的列,并使用常量来表示不同的时间表类型。你也可以使用 enum 插件.

© www.soinside.com 2019 - 2024. All rights reserved.