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

По сути, я позволяю активному заданию выполняться, но активное задание проверяет, что объект вещи не обновлялся с тех пор, как текущее активное задание было поставлено в очередь.

Другие вопросы по тегам