delayed_job vs. cron

时间:2011-10-10 00:17:03

标签: ruby-on-rails ruby-on-rails-3 cron delayed-job whenever

我有一个系统,用户进入一个包含多个部分的应用程序进程 - 有时用户会保存他们的进度并稍后再回来。

如果用户未在48小时内回复,我希望向用户发送电子邮件 - 是否最好使用crondelayed_jobwhenever执行此操作?

我注意到每当我在控制台中运行操作时(例如bundle installrake db:migrate),它也会运行cron,这让我怀疑我们可能有用户获得多个提醒的实例在同一天。

您对此有何建议?

1 个答案:

答案 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