Ruby on rails 3 延迟的作业操作邮件缓存?
我现在打电话给一个延迟的作业(gem delayed_job_mongoid)发送确认电子邮件。但是,它似乎没有使用我传递的最新数据,而是使用缓存版本。见下文: 我的控制器:Ruby on rails 3 延迟的作业操作邮件缓存?,ruby-on-rails-3,actionmailer,delayed-job,Ruby On Rails 3,Actionmailer,Delayed Job,我现在打电话给一个延迟的作业(gem delayed_job_mongoid)发送确认电子邮件。但是,它似乎没有使用我传递的最新数据,而是使用缓存版本。见下文: 我的控制器: ... _user.calculate_orders _user.save _user.reload Mailer.delay.order_reported(_user) ... 邮递员 class Mailer < Devise::Mailer def order_reported(to_user)
...
_user.calculate_orders
_user.save
_user.reload
Mailer.delay.order_reported(_user)
...
邮递员
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
这不起作用,并且使用缓存数据
Mailer.delay.order_reported(u)
我最近遇到了一个非常类似的问题,与传入我的用户对象的序列化版本有关,而不仅仅是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
class-Mailer带有名称的电子邮件,:主题=>“测试电子邮件”)
结束
结束
这将确保在邮件实际送达时,您总能获得一个新的用户对象。嗨,蒂姆,谢谢您的建议。我试过了,但它似乎仍在缓存旧对象。只有重新启动DJ worker时,它才会重新加载。然后我尝试了@to_user=user.find(to_user\u id).reload,这似乎很有效,但效率不是很低吗?不,因为您需要从数据库中加载对象。它将结束我们作为一个简单的选择查询,可以很容易地缓存的数据库。谢谢。奇怪的是,.find()不起作用,但.find().reload起作用,即使它是另一个工作程序。
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