gpt4 book ai didi

ruby-on-rails - 如何访问事件作业中的延迟作业实例 - Rails 4.2

转载 作者:行者123 更新时间:2023-12-04 06:35:19 25 4
gpt4 key购买 nike

我在后台使用带有 delay_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 ,我在延迟作业表中添加了两列:
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

但这不起作用。

有人遇到过这种问题吗?

最佳答案

两个变化:
1. 更新了 after_enqueue 回调,以便您可以更新
直接delay_jobs表
2. 修正了 delayed_reference_id 的拼写错误被硬编码为 1

这应该有效:

class MyJob < ActiveJob::Base

after_enqueue do |job|
user = self.arguments.first
delayed_job = Delayed::Job.find(job.provider_job_id)
delayed_job.update(delayed_reference_id:user.id,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: user_id, delayed_reference_type: 'User').delete
end
end

关于ruby-on-rails - 如何访问事件作业中的延迟作业实例 - Rails 4.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31465201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com