【问题标题】:Delayed_job ActionMailer caching?Delayed_job ActionMailer 缓存?
【发布时间】:2013-03-20 01:52:13
【问题描述】:

我目前调用延迟作业 (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)
    @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 并保存。正确反映在数据库中,延迟的作业数据库记录包含更新信息 5,但发送电子邮件时,它使用缓存信息 3。

我也尝试过通过 rails 控制台调用该方法:

这工作并使用传递和更新信息的参数

Mailer.order_reported(u).deliver

这不起作用并使用缓存数据

Mailer.delay.order_reported(u)

【问题讨论】:

    标签: ruby-on-rails-3 actionmailer delayed-job


    【解决方案1】:

    我最近遇到了与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
    

    这将确保在您的邮件实际送达时您始终获得一个新的用户对象。

    【讨论】:

    • 嗨蒂姆,感谢您的建议。我试过了,但似乎delayed_job 仍然缓存旧对象。如果我重新启动 DJ 工作者,它似乎只会重新加载。然后我尝试了@to_user = User.find(to_user_id).reload,这似乎有效,但这不是效率低吗?
    • 不,因为无论如何您都需要从数据库中加载对象。它将结束我们作为一个简单的 SELECT 查询,可以很容易地被数据库缓存。
    • 谢谢。奇怪的是 .find() 不起作用但 .find().reload 起作用,即使它是不同的工作人员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 2014-09-15
    • 2015-03-18
    • 1970-01-01
    • 2011-07-18
    • 2011-05-23
    相关资源
    最近更新 更多