2013-03-12 2 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-веб выдает сообщение об ошибке:

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

который немного странно, потому что, если я пойду в Rails консоли искать для этого видео. Он существует. Кроме того, вызывая Resque.enqueue(AddVideo, 51061) ВТОРОЕ время, выполняется без каких-либо ошибок.

Это как если требуется больше времени для сохранения записи в базе данных, чем требуется для создания рабочего/задания. Но даже этот оператор не складывается, поскольку объект вызывает 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_create в

after_commit :send_to_background_job, on: :create