我想让我的用户可以选择在特定的(用户给定的)时间向他们发送帐户统计信息的每日摘要....
让我们说下面的模型:
class DailySummery << ActiveRecord::Base
# attributes:
# send_at
# => 10:00 (hour)
# last_sent_at
# => Time of the last sent summary
end
现在是否有最佳实践如何通过电子邮件将此帐户摘要发送到特定时间?
目前我有一个无限的 rake 任务正在运行,它会永久检查电子邮件是否可用于发送,我想将 dailysummary-generation 和 send 放入这个 rake 任务中。
我想我可以用下面的伪代码来解决这个问题:
while true
User.all.each do |u|
u.generate_and_deliver_dailysummery if u.last_sent_at < Time.now - 24.hours
end
sleep 60
end
但我不确定这是否有一些隐藏的警告...
注意:我不想使用像 resq 或 redis 之类的队列!
编辑:添加 sleep (已在我的脚本中)
编辑:这是一项时间紧迫的服务(交易率通知),因此它应该尽可能快。这就是为什么我不想使用队列或基于作业的系统的背景。我使用 Monit 来管理这个 rake 任务,它工作得很好。
最佳答案
只有两种主要方式可以延迟执行。当您网站上的用户点击页面时,您运行脚本,这是低效且不完全准确的。或者使用某种后台进程,无论是 cron 作业还是 resque/delayed 作业等。
虽然您让 rake 进程永远运行的方法可以正常工作,但效率很低,因为您在它完成后立即对用户进行 24/7 迭代,例如:
while true
User.where("last_sent_at <= ? OR last_sent_at = ?", 24.hours.ago, nil).each do |u|
u.generate_and_deliver_dailysummery
end
sleep 3600
end
每小时运行一次并且只拉取需要发送电子邮件的用户效率更高一些。最佳实践是使用 cronjob 来运行你的 rake 任务。
关于ruby-on-rails - Rails 3.1/rake - 没有队列的特定于日期的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8705526/