ruby-on-rails - 延迟的工作。从队列中删除作业

标签 ruby-on-rails ruby delayed-job

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/

相关文章:

ruby-on-rails - Ruby on Rails - 何时使用 params.permit!以及如何更换它

javascript - Ruby on Rails 筹款进度条

ruby-on-rails - 超出范围错误,在 rspec 测试期间类型::整数

ruby-on-rails - pg gem install 失败说版本太旧?

ruby - Ruby 异常的文档

ruby-on-rails - 使用 Delayed_Job 发送电子邮件

ruby-on-rails - 使用 Ruby on Rails 漂亮地打印一个数组

ruby - ruby 模块中 'self' 的结果

sql - postgres 上这个 delayed_job 查询的最佳索引是什么?

ruby-on-rails-3 - 在 Heroku 上运行调度程序或延迟作业的最佳实践是什么?