我有一个系统,用户进入一个包含多个部分的应用程序进程 - 有时用户会保存他们的进度并稍后再回来。
如果用户未在48小时内回复,我希望向用户发送电子邮件 - 是否最好使用cron
,delayed_job
或whenever
执行此操作?
我注意到每当我在控制台中运行操作时(例如bundle install
或rake db:migrate
),它也会运行cron,这让我怀疑我们可能有用户获得多个提醒的实例在同一天。
您对此有何建议?
答案 0 :(得分:5)
首先,每当和Cron是同义词时。所有Whenever都为你提供了一种使用Ruby编写cronjobs的方法(这很棒,我喜欢,无论何时)。
Delayed_job不是这里的答案。你肯定想用cronjobs。在您的应用程序模型上创建一个方法,该方法将获得updated_at
值为< 2.days.ago
的应用程序并通过电子邮件发送给其申请人。
def notify_stale_applicants
@stale_applications = Application.where('updated_at < ?', 2.days.ago) # or 48.hours.ago
@stale_applications.each do |app|
UserMailer.notify_is_stale(app).deliver
end
end
您的UserMailer:
def notify_is_stale(application)
@application = application
mail(:to => application.user.email, :from => "Application Status <status@yourdomain.com>", :subject => "You haven't finished your Application!"
end
使用随时创建此cron:
every :day, :at => '8am' do
runner 'Application.notify_stale_applicants'
end