2013-03-12 14 views
5

私たちのRailsアプリケーションで。モデル(ビデオ)を保存します。私たちは、そのオブジェクトのコールバックを持っている:私のresqueジョブがオブジェクトを見つけることができないのはなぜですか?

after_create :send_to_background_job, :if => :persisted? 

方法は次のようになります。労働者が呼び出されると

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

。これは、次のことを行います。私はこのビデオを探すために、コンソールをレールに行けば、ので、少し奇妙である

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

class AddVideo 
    @queue = :high 

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

Resque-ウェブはエラーを報告します。それは存在する。さらに、Resque.enqueue(AddVideo, 51061)をSECOND時間呼び出すと、エラーなしで実行されます。

データベースにレコードを保存するのに時間がかかるのは、ワーカー/ジョブの作成にかかる時間よりも長くなります。しかし、オブジェクトが保存された後にオブジェクトが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

これはおそらく起こります。

あなたは

after_commit :send_to_background_job, on: :create 
にafter_createを切り替える必要があります
関連する問題