2013-03-12 15 views
5

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 

risposta

9

Questo accade probabilmente perché la transazione reale in cui viene salvato l'oggetto non è stato ancora commesso e il lavoro di fondo già iniziato a lavorare su di esso.

Si dovrebbe cambiare l'after_create a

after_commit :send_to_background_job, on: :create 
Problemi correlati