2013-03-12 1 views
5

레일 앱. 우리는 모델을 저장합니다 (비디오). 우리는 그 객체에 콜백을 가지고 :내 resque 작업에서 개체를 찾을 수없는 이유는 무엇입니까?

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

작업자가 호출 될 때 :

after_create :send_to_background_job, :if => :persisted? 

방법은 같습니다. 그것은 다음과 같은 작업을 수행 :이 비디오를 찾기 위해 콘솔을 레일로 이동하는 경우, 때문에, 조금 이상한

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을 전환해야
관련 문제