Rails 5: удалите ActiveJob, прежде чем он будет выполнен - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть ActiveJob, который меняет поле статуса записи с «в ожидании» на «живой» X минут после ее создания. Хорошо работает.

Когда пользователь редактирует запись в течение X минут, мне нужно отменить это изменение статуса, а именно. перезагрузите часы. Предположительно, я бы сделал это, отменив ActiveJob и создав новый. В Rails Guides для 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 Ответ

0 голосов
/ 19 ноября 2018

Я решил подобные ситуации в своих проектах следующим образом ... Я ставлю 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

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

...