我有一个观察到的模型,但在延迟作业中保存模型时没有调用观察者的回调
观察员:
# 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中发生的事情是没有正确设置观察者?
观察者在不延迟方法的情况下工作,当然,无需手动实例化观察者。