2013-03-04 32 views
0

我目前調用delayed_job(gem delayed_job_mongoid)發送確認郵件。但是,它似乎並未使用我傳遞的最新數據,而是使用緩存版本。見下文:Delayed_job ActionMailer緩存?

我的控制器:

... 
_user.calculate_orders 
_user.save 
_user.reload 
Mailer.delay.order_reported(_user) 
... 

的Mailer

class Mailer < Devise::Mailer 
    def order_reported(to_user) 
    @to_user = to_user 
    email_with_name = "#{@to_user.name} <#{@to_user.email}>" 
    mail(:to => email_with_name, :subject => "Test email") 
    end 
end 

例如,如果一個屬性_user.total_orders = 3被更新到5並保存。它正確地反映到數據庫中,延遲工作DB記錄包含5更新的信息,但在發送電子郵件時,它用3

我也試着通過導軌控制檯調用方法緩存信息:

這個工程,並使用則傳遞和更新信息

Mailer.order_reported(u).deliver 

這不工作,使用緩存的數據

Mailer.delay.order_reported(u) 

回答

0

我有一個非常相似的親參數最近與Sidekiq混淆,涉及傳入我的用戶對象的序列化版本,而不僅僅是一個ID。

我會稍微重構,只傳遞簡單對象作爲延遲方法中的參數。所以,你可以這樣做,而不是:

Mailer.delay.order_reported(_user.id) 

,然後更新內容如下方法:

class Mailer < Devise::Mailer 
    def order_reported(to_user_id) 
    @to_user = User.find(to_user_id) 
    email_with_name = "#{@to_user.name} <#{@to_user.email}>" 
    mail(:to => email_with_name, :subject => "Test email") 
    end 
end 

這將確保您始終獲得一個新的用戶對象時,你的郵包實際交付。

+0

嗨蒂姆,感謝您的建議。我嘗試過,但似乎delayed_job仍然緩存舊對象。它似乎只是重新加載,如果我重新啓動DJ工作。然後我嘗試@to_user = User.find(to_user_id).reload,這似乎工作,但不是那麼低效? – Dean 2013-03-25 10:27:27

+0

不能,因爲你需要從數據庫中加載對象。它將結束我們作爲一個簡單的SELECT查詢,可以由數據庫輕鬆緩存。 – 2013-03-26 13:19:05

+0

謝謝。很奇怪,.find()不起作用,但.find()。reload做,即使它是一個不同的工作者。 – Dean 2013-03-28 11:48:12