【问题标题】:Remove all Delayed Jobs for a specific Object in Rails 5在 Rails 5 中删除特定对象的所有延迟作业
【发布时间】:2017-10-30 18:25:56
【问题描述】:

我在我的 Rails 5 应用程序中使用延迟作业。

例如,我有一个 Trip 模型并且正在创建两个延迟的作业:

Trip.delay(run_at: ...).send_reminder
Trip.delay(run_at: ...).get_feedback

所以我创建了两个延迟的工作。

现在,如果 Trip 被删除,我还想删除延迟的作业,更重要的是,如果 Trip 被更改,我想更新作业(新的 run_at 时间),所以我会删除并重新创建工作。

但是我如何识别属于 Trip 的工作?有什么方法吗?我试图添加一个trip_id 列,但不知道如何在创建新作业时分配trip_id。

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5 delayed-job


【解决方案1】:

像这样为每个 DelayedJob 工作创建一个 Job 类

class TripSendReminderJob < Struct.new(:trip)
  def perform
    # reload use the updated values of a trip, if it was changed
    trip.send_reminder if trip.reload.active? # active? or any method or condition you need to check
  end
end

然后,在你的代码中的任何地方

trip = Trip.find(trip_id)
trip_send_reminder_job = TripSendReminderJob.new(trip)
Delayed::Job.enqueue(trip_send_reminder_job, run_at: ...)

奖励,使用像 TripSendReminderJob 这样的作业对象允许您使用像以前一样的钩子、错误、失败等。您可以在 DelayedJob github page 中看到所有这些

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 2020-09-03
    • 2020-04-05
    • 1970-01-01
    • 2013-11-26
    • 2011-08-26
    • 2012-04-20
    相关资源
    最近更新 更多