【问题标题】:Delayed Job - Find by object id延迟作业 - 按对象 ID 查找
【发布时间】:2015-05-31 13:20:55
【问题描述】:

我使用的是 Rails + DelayedJob Mongoid。我有这个模型:

class User
  def run
    ...
  end
end

我创建新的Dejayed::Job 对象:

user = Use.create
user.delay.run

我该如何做这样的事情?

Delajed::Job.where(object_id: user.id)

【问题讨论】:

    标签: ruby-on-rails ruby mongoid delayed-job


    【解决方案1】:

    我不确定这是否适用于您的情况。

    如果你有delayed_job对象id,你可以像普通的activerecord对象一样简单地找到它。

    # find a job by id
    job = Delayed::Job.find(params[:id])
    

    现在,当您没有 id 时。然后在创建作业的过程中添加一些独特的东西

    users_controller.rb

    user = User.create
    

    user.rb

    def delayed_run
      my_job = MyJob.new('xyz')
      job = Delayed::Job.enqueue(run, 0, 1.hour.from_now)
      job.user_id = self.id
    end
    

    所以在此之后,您可以从唯一的 user_id 中找到您的延迟作业对象

    Delayed::Job.where(user_id: 5)
    

    【讨论】:

    • 这给了我这个错误:#<:backend::mongoid::job:0x000000064d8860> 的未定义方法 `user_id='。我不得不猴子补丁作业类。谢谢你的想法。
    【解决方案2】:

    根据@aelor 的回答,最后我不得不将字段object_id 添加到 Job 类:

    # config/initializers/dejayed_job.rb
    
    module Delayed
      module Backend
        module Mongoid
          class Job
            include ::Mongoid::Document
            field :object_id
          end
        end
      end
    end
    

    然后就可以了:

    user = Use.create
    user.delay(object_id: user.id).run
    
    Delayed::Job.where(object_id: 5).first
    => #<Delayed::Backend::Mongoid::Job _id: 551a5116726a750e08000000
    

    【讨论】:

    • 在非 Mongoid 延迟工作上尝试了您的解决方案,但它似乎不喜欢该领域 :)。我确实找到了一个关于如何包装延迟作业并提供类似甚至更好的自定义的好教程:sitepoint.com/delayed-jobs-best-practices
    猜你喜欢
    • 2013-05-01
    • 2016-03-29
    • 2018-05-31
    • 1970-01-01
    • 2011-12-14
    • 2022-11-10
    • 1970-01-01
    • 2013-06-10
    • 2015-07-03
    相关资源
    最近更新 更多