2014-07-02 53 views
0

我有一個典型的ActionMailer,它有一個指定電子郵件傳遞的方法。處理作業時是否延遲執行Sidekiq Mailer方法?

def some_email(user_id) 
@user = User.find(user_id) 

    if @user.eligible_for_email? 
    mail(to: @user.email, from: "[email protected]", subject: "The Subject") 
    @user.email_sent = Date.today 
    @user.save 
    end 
end 

我不想耽誤這一點使用Sidekiq的發送所以我用:

Mailer.delay_for(2.days).some_email(user.id) 

的eligible_for_email方法:

def eligible_for_email? 
    !unsubscribed? && email_sent.nil? 
end 

在此期間,用戶可以有退訂,這爲什麼在用戶模型中有一種方法叫做eligible_for_email?,我可以用它來有條件地發送電子郵件 - 但顯然這種情況需要在電子郵件發出之前進行測試nt,而不是在工作安排時。

所以問題是,當我使用Sidekiq來處理這個問題時,條件邏輯在作業完成時似乎沒有運行。

Sidekiq是否在運行時執行some_email方法,然後將產生的電子郵件排隊等待兩天後發送出去,從而否定了我的條件代碼?

+0

'some_email'方法直到預定時間才被調用。這個問題可能在'eligible_for_email?'中嗎?你可以發佈該方法的代碼? – infused

+0

當然。 BTW它工作正常,當我打電話Mailer.some_email(user.id).deliver – edralph

+0

是否'email_sent'被設置在適當的一天或它被設置爲郵件入隊後?這會告訴你何時調用'some_email'方法。另外,'unsubscribed'是一個簡單的布爾屬性,還是一種方法? – infused

回答

1

你的理解是100%正確的,這正是你想要做的。

我猜你沒有重新啓動Sidekiq來取代你的代碼更改。 Sidekiq不會像Rails那樣自動重新加載更改後的代碼。

+0

感謝您回答Mike :)請原諒我的無知 - Sidekiq緩存要運行的代碼嗎?因此,在執行該方法的兩天內,它會執行一個它自己保留的副本?儘可能快地嘗試你的建議。 – edralph

+0

@edralph你解決了你的問題嗎?我試圖達到同樣的目的。 – acrogenesis