2014-06-06 80 views
1

我有許多Appointment型號在一天的不同時間開始,或者在:00,:15,:30,:45。我想觸發代碼發送提醒1小時事件開始之前。使用後臺工作人員來觸發此事的最佳方式是什麼?我也使用clockwork寶石,所以我可以安排Sidekiq工作人員。在活動開始前一小時觸發的最佳方式

回答

2

clockwork寶石用於固定計劃任務(替換爲cron)。你要使用ActionMailer.delay_until附帶sidekiq

class Appointment 
    after_create :queue_reminder 

    def queue_reminder 
    MyMailer.delay_until(event_time - 1.hour).appointment_reminder(id) 
    end 
end 

sidekiq文檔瀏覽:https://github.com/mperham/sidekiq/wiki/Delayed-Extensions

正如shock_one提到的,如果你更新一個新的日期約會,你就必須重新排隊一提醒並取消舊的。如果Appointment被銷燬,您還需要取消作業。

爲此,我建議您使用sidekiq-statusreminder_job_id列。您的Appointment模型然後看起來像這樣:

class Appointment 
    before_save :queue_reminder, if: :event_time_changed? 
    after_destroy :cancel_reminder, if: :reminder_job_id? 

    def queue_reminder 
    cancel_reminder if reminder_job_id 
    self.reminder_job_id = MyMailer.delay_until(event_time - 1.hour) 
            .appointment_reminder(id) 
    end 

    def cancel_reminder 
    Sidekiq::Status.cancel reminder_job_id 
    end 
end 
0

首先你必須決定誰將負責安排。你可以有一個後臺進程,每十五分鐘運行一次,或者你可以讓模型在其生命的某個時刻安排事件 - 可能是在創建之後。

以前的解決方案更易於理解和維護,但後臺進程會有許多無用的空循環。

另一方面,後一種解決方案更精確。它將按需要執行多次。但是,如果模型更改,則可能會遇到困難:例如,創建後時間已被修改。您需要以某種方式取消上一個活動,然後安排一個新活動。

相關問題