Nella nostra app Rails. Salviamo un modello (video). Abbiamo un callback su tale oggetto:Perché il processo di resque non può trovare l'oggetto?
after_create :send_to_background_job, :if => :persisted?
Il metodo appare come:
def send_to_background_job
Resque.enqueue(AddVideo, self.id)
end
Quando il lavoratore è chiamato. Si fa il seguente:
class AddVideo
@queue = :high
def self.perform(video_id)
video = Video.find(video_id)
video.original_file_name
....
Resque-web segnala un errore:
AddVideo
Arguments
51061
Exception
NoMethodError
Error
undefined method `original_filename' for nil:NilClass
Che è un po 'strano, perché, se vado a Rails console per cercare questo video. Esiste. Inoltre, chiamando il Resque.enqueue(AddVideo, 51061)
un SECONDO tempo, funziona senza errori.
È come se ci vuole più tempo per salvare il record nel database, di quanto ci vuole per creare il lavoratore/lavoro. Ma anche questa affermazione non si aggiunge, poiché l'oggetto chiama il lavoro Resque solo dopo che l'oggetto è stato salvato. In Rails, ciò avviene tramite un metodo di callback nel modello (after_create
).
Non so se questo ha un ruolo nel problema. In un file di inizializzazione, ho:
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