Należy się tym zająć podczas tworzenia zadania:
priority = 0
run_time = my_object.start_time
Delayed::Job.enqueue(MyCustomJob.new(my_object), priority, run_time)
https://github.com/tobi/delayed_job/wiki
Jeśli zadania nie są wyświetlane w spodziewanym czasie, może być szeregowania je do UTC :
http://www.gregbenedict.com/2009/08/19/is-delayed-job-run_at-datetime-giving-you-fits/
Aby sprawdzić kolejkę do istniejącego j ob - można wykonać następujące czynności:
class MyCustomJob < Struct.new(:object_id)
def self.exists?(object_id)
Delayed::Job.where(['handler = ? and failed_at is null',handler(object_id)]).count(:all) > 0
end
def self.handler(object_id)
"--- !ruby/struct:MyCustomJob \nobject_id: #{object_id}\n"
end
def perform
my_object = MyObject.find(object_id)
my_object.do_stuff
end
end
Następnie wystarczy sprawdzić MyCustomJob.exists?(my_object.id)
przed kolejkach.
To trochę hack - w razie potrzeby edytuj metodę handler
. Zmodyfikuję tabelę delayed_jobs tak, aby miała ona właściwość class/id_obiektu, aby uzyskać czystszy kod i bardziej wydajne skanowanie tabeli, jeśli twoja tabela zadań jest duża lub jeśli robisz to z innymi typami zadań.
ta kwestia wygląda również istotne:
How to cancel scheduled job with delayed_job in Rails?
zrobić chcesz uzyskać obiekt ** Opóźniony :: Praca ** AR wewnątrz metody ** perform **? – Anatoly
dokładnie! muszę sprawdzić, czy zmieniono parametr start_time obiektu. – Oliver