class Radar
include Mongoid::Document
after_save :post_on_facebook
private
def post_on_facebook
if self.user.settings.post_facebook
Delayed::Job.enqueue(::FacebookJob.new(self.user,self.body,url,self.title),0,self.active_from)
end
end
end
class FacebookJob < Struct.new(:user,:body,:url,:title)
include SocialPluginsHelper
def perform
facebook_client(user).publish_feed('', :message => body, :link => url, :name => title)
end
end
我想在特定日期执行 post_on_facebook 方法。我将此日期存储在“active_from”字段中。
上面的代码正在运行,并且作业在正确的日期执行。
但在某些情况下,我首先创建 Radar 对象并将一些作业发送到延迟作业队列。之后,我更新此对象并将另一个作业发送到延迟作业。
这是错误的行为,因为我不想在正确的时间只执行一次作业。在此实现中,我将执行 2 个作业。如何删除之前的作业以便只执行更新的作业?
Rails 3.0.7
Delayed Job => 2.1.4 https://github.com/collectiveidea/delayed_job
ps:对不起我的英语,我尽力做到最好
最佳答案
听起来您想在雷达对象更新并重新排队时将任何作业出队。
Delayed::Job.enqueue 应该返回一个 Delayed::Job 记录,这样您就可以从中获取 ID 并将其保存回 Radar 记录中(在 Radar 文档上为其创建一个字段),以便您可以找到它稍后再次轻松地进行。
您应该将其更改为 before_save,这样就不会进入无限的保存循环。
before_save :post_on_facebook
def post_on_facebook
if self.user.settings.post_facebook && self.valid?
# delete existing delayed_job if present
Delayed::Job.find(self.delayed_job_id).destroy if self.delayed_job_id
# enqueue job
dj = Delayed::Job.enqueue(
::FacebookJob.new(self.user,self.body,url,self.title),0,self.active_from
)
# save id of delayed job on radar record
self.delayed_job_id = dj.id
end
end
关于ruby-on-rails - 延迟的工作。从队列中删除作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6022424/