2011-10-10 46 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