2013-03-12 77 views
5

在我们的Rails应用程序中。我们保存一个模型(视频)。我们有对象的回调:为什么我的重新找工作找不到对象?

after_create :send_to_background_job, :if => :persisted? 

的方法是这样的:

def send_to_background_job 
    Resque.enqueue(AddVideo, self.id) 
end 

当工人被调用。它具有以下功能:

class AddVideo 
    @queue = :high 

    def self.perform(video_id) 
    video = Video.find(video_id) 
    video.original_file_name 
    .... 

Resque的Web报告错误:

AddVideo 
Arguments 
51061 
Exception 
NoMethodError 
Error 
undefined method `original_filename' for nil:NilClass 

这是一个有点古怪,因为,如果我去Rails的控制台来寻找这个视频。它确实存在。此外,在第二次调用Resque.enqueue(AddVideo, 51061)时,运行没有任何错误。

这好像需要更多时间才能保存数据库中的记录,而不是创建worker/job。但是即使这个语句没有加起来,因为对象只有在对象被保存后才会调用Resque作业。在Rails中,这是通过模型中的回调方法完成的(after_create)。

不知道这是否在问题中发挥作用。在一个初始化文件,我有:

Resque.before_fork do 
    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.connection.disconnect! 
end 

Resque.after_fork do 
    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.establish_connection 
end 

回答

9

这可能是因为在其中保存对象的实际交易尚未COMMITED和后台作业已经开始做这个工作。

您应该after_create切换到

after_commit :send_to_background_job, on: :create