我正在使用后台的delayed_job (4.0.6)和ActiveJob,我想找到一个已经计划好的任务并将其删除。
例如,如果我有以下代码:
class MyClass
def my_method
perform_stuff
MyJob.set(wait: 1.month.from_now).perform_later(current_user)
end
end
然后,如果我编辑了MyClass实例并再次调用my_method,我希望取消该作业并安排一个新的作业。
如在此帖子中建议的http://www.sitepoint.com/delayed-jobs-best-practices,我向Delayed Job表添加了两个列。
table.integer :delayed_reference_id
table.string :delayed_reference_type
add_index :delayed_jobs, [:delayed_reference_id], :name => 'delayed_jobs_delayed_reference_id'
add_index :delayed_jobs, [:delayed_reference_type], :name => 'delayed_jobs_delayed_reference_type'
我希望通过这种方式找到一个延迟的任务并将其删除。但是我想在ActiveJob类中执行此操作,以保持项目中作业模式的一致性。
我想做这样的事情:
class MyJob < ActiveJob::Base
after_enqueue do |job|
user = self.arguments.first
job.delayed_reference_id = user.id,
job.delayed_reference_type = "User"
end
def perform(user)
delete_previous_job_if_exists(user_id)
end
def delete_previous_job_if_exists(user_id)
Delayed::Job.find_by(delayed_reference_id: 1, delayed_reference_type: 'User').delete
end
end
但是那并不起作用。 有人遇到过这种问题吗?