В нашем приложении 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