处理此问题的最典型方法是使用 cron 作业。您安排一个作业每 15 分钟左右运行一次,并在此期间提供任何提醒。不幸的是,heroku 只允许 cron 作业每小时运行一次,这通常是不够的。
在这种情况下,我会使用delayedjob 并诱骗它设置一个重复任务,该任务会根据需要经常发送通知。例如,您可以创建一个函数,首先将自身重新安排为在 10 分钟内运行,然后继续发送在前 10 分钟内弹出的任何提醒。
要查看延迟作业的 send_at 语法以安排未来的作业,请在此处查看:https ://github.com/tobi/delayed_job/wiki
评论后添加:要发送提醒,您需要创建一个搜索待处理提醒并发送它们的函数。例如,假设您有一个名为 Reminder 的模型(rails 3 语法,因为我更喜欢它):
def self.find_and_send_reminders
reminders = Reminder.where("send_at < ? AND sent = ?", Time.now, false).all
reminders.each do |r|
#the following delayed_job syntax is apparently new, and I haven't tried it. came from the collective_idea fork of delayed_job on github
Notifier.delay.deliver_reminder_email(r)
#I'm not checking to make sure that anything actually sent successfully here, just assuming they did. may want to address this better in your real app
r.update_attributes!(:sent => true)
end
#again using the new syntax, untested. heroku may require the old "send_at" and "send_later" syntax
Reminder.delay(:run_at => 15.minutes.from_now).find_and_send_reminders
end
此语法假定您决定对每个发生方法使用单个提醒条目。如果您决定对所有重复提醒使用单个条目,您可以创建一个类似“last_sent”的字段,而不是“sent”的布尔值并使用它。请记住,这些都只是想法,我实际上还没有花时间来实现这样的东西,所以我可能还没有考虑所有的选项/问题。