Rails:从delayed_job中保存的模型触发观察者

时间:2013-11-26 19:32:25

标签: ruby-on-rails activerecord delayed-job observer-pattern

我有一个观察到的模型,但在延迟作业中保存模型时没有调用观察者的回调

观察员:

# app/models/my_model_observer.rb
class MyModelObserver < ActiveRecord::Observer
  observe MyModel

  def after_create(my_model)
    Rails.logger.debug my_model.inspect
  end
end

我注册了观察员:

config.active_record.observers = 'MyModelObserver'

在我创建模型的控制器中,我使用delayed_job:

def create
  MyModel.delay.do_lots_of_work params[:my_model]
end

do_lots_of_work结束时,我在my_model的新实例上调用save并将其成功保存到数据库,但观察者的after_create回调从未运行。我可以告诉它没有运行,因为它没有记录,我甚至尝试将它写入root中的新文件但是没有创建任何文件。

delayed_job不会注意到我已经注册了观察者吗?有办法解决这个问题吗?如何在工人身上发现模型的生命周期?

更新

我一直在尝试调试这个,所以我开始在延迟方法中使用binding.pry来查看观察者是否已注册。我的delayed_job日志显示了进度(从我自己的日志记录)直到binding.pry停止并让我控制控制台。我输入MyModelObserver,然后在那里输入。我键入MyRailsApp::Application.config.active_record,是的,观察者已注册。我输入exit,nope,我的观察者没有记录任何东西。我再次尝试,但这次我尝试实例化观察者MyModelObserver.new抱怨说新的是私有方法。好吧,我会强制它MyModelObserver.send :new并返回一个观察者的实例,很棒,无论如何。我在那之后输入退出,并且在模型保存后,我的观察者记录了圣洁!什么?!所以,我添加了实例化的行到我的延迟方法的顶部,它修复了问题,我的观察者现在正在执行。但是我当然不想硬编码,所以我仍然有问题。在delayed_job中发生的事情是没有正确设置观察者?

观察者在不延迟方法的情况下工作,当然,无需手动实例化观察者。

0 个答案:

没有答案