Rails 5: удалите ActiveJob, прежде чем он будет выполнен
У меня есть ActiveJob, который меняет поле статуса записи с "в ожидании" на "живой" X минут после ее создания. Это работает хорошо.
Когда пользователь редактирует запись в течение Х минут, мне нужно отодвинуть это изменение статуса, а именно. перезапустите часы. Предположительно я бы сделал это, отменив ActiveJob и создав новый. Руководства по Rails для ActiveJob не упоминают, как это должно быть сделано.
Я вижу, что я могу назначить ActiveJob переменной, например:
j = ThingLiveJob.set(wait: 1.minute).perform_later(@thing)
и используя byebug
сразу после этой строки (в контроллере) я вижу, что она выводит так:
#<ThingLiveJob:0x000000134a5fc0 @arguments=[#<Thing id: 1095, body: "Whatever", user_id: 1, created_at: "2018-11-19 10:34:24", updated_at: "2018-11-19 10:34:24", status: "pending">], @job_id="aab28c66-f8b4-491e-9c7f-af6f27aa482e", @queue_name="default", @priority=nil, @executions=0, @scheduled_at=1542623724.674397, @provider_job_id="61c154d5-9c1b-45a1-8487-824a4412c53c">
Однако на консоли ни одно из этих предположений не работает:
j.destroy
j.delete
Так как я должен идти об этом?
1 ответ
Я решил подобные ситуации в своих проектах следующим образом: я ставлю active_job в очередь после каждого обновления или создания записи, но я называю это следующим образом:
ThingLiveJob.set(wait: 1.minute).perform_later(@thing.id, @thing.updated_at)
Тогда в коде activejob...
def perform(thing_id, thing_updated_at)
thing = Thing.find(thing_id)
return if thing_updated_at != thing.updated_at
...
end
По сути, я позволяю активному заданию выполняться, но активное задание проверяет, что объект вещи не обновлялся с тех пор, как текущее активное задание было поставлено в очередь.