2013-03-04 93 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