Rails 5: 在执行 ActiveJob 之前删除它

4
我有一个ActiveJob,它会在记录创建后X分钟将状态字段从“待定”更改为“上线”。它运作良好。
当用户在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个回答

5
我在类似情况下的项目中解决方法如下... 我会在每次记录更新或创建后排队 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

实际上,我让活动作业运行,但是该活动作业会检查物体对象自当前活动作业排队以来是否已更新。


好的,我会看看是否有其他人在晚上提出更好的想法,并在明天回复您。 - MSC
我正在做同样的事情。 - Pavel Mikhailyuk
我需要将两个参数转换为字符串才能使其正常工作:ThingLiveJob.set(wait: 1.minute).perform_later(@thing.id.to_s, @thing.updated_at.to_i.to_s) - MSC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接