2011-10-10 47 views
2

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

我想给用户发送一封电子邮件,如果他们还没有在48小时内回来 - 最好是使用cron,delayed_jobwhenever这样做吗?

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

对此有何建议?

回答

5

首先,每当和克伦是同义词。所有无论何时提供一种方法让你使用Ruby编写cronjobs(这真是太棒了,我喜欢Whenever)。

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 <[email protected]>", :subject => "You haven't finished your Application!" 
end 

使用时创建此的cron:

every :day, :at => '8am' do 
    runner 'Application.notify_stale_applicants' 
end