【问题标题】:Add custom columns to delayed_jobs table将自定义列添加到 delay_jobs 表
【发布时间】:2013-12-31 23:48:43
【问题描述】:

谁能告诉我如何扩展delayed_jobs gem 以允许我添加几个自定义列?

我添加了几列,但是当我尝试“干净地”使用它们时,我得到:

无法批量分配受保护的属性:owner_type、owner_id

所以我需要将列添加到 cattr_accessor:

module Delayed
  class Worker
    DEFAULT_SLEEP_DELAY      = 5
    DEFAULT_MAX_ATTEMPTS     = 25
    DEFAULT_MAX_RUN_TIME     = 4.hours
    DEFAULT_DEFAULT_PRIORITY = 0
    DEFAULT_DELAY_JOBS       = true
    DEFAULT_QUEUES           = []
    DEFAULT_READ_AHEAD       = 5

    cattr_accessor :min_priority, :max_priority, :max_attempts, :max_run_time,
      :default_priority, :sleep_delay, :logger, :delay_jobs, :queues,
      :read_ahead, :plugins, :destroy_failed_jobs, **:owner_id, :owner_type**

但是,不确定扩展它的最佳方式。我的猜测/尝试是创建一个文件并将其添加到初始化程序目录中。但是,由于某种原因,它不起作用。

感谢任何提示。

【问题讨论】:

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


    【解决方案1】:

    你真的需要扩展delayed_jobs 表吗?我的方法是不管它,使用以下两种技术之一:

    • 为正在排队的对象添加 owner_id 和 owner_type 字段。
    • 创建一个与delayed_jobs 有:belongs_to 关系的单独表。然后,您可以使用 DJ 的钩子在工作的整个生命周期中使两者保持同步。

    第一种方法更简单,但并不适合所有情况。这两种方法都适合你吗?

    【讨论】:

    • 我可能会走这条路 - 但其他开发人员已经添加了列。我想通过延迟(:owner_id => etc...)访问这些列。否则,我必须创建一个 DJ 实例并像分配任何其他对象一样分配值。没关系,但是在 gem 中添加一些代码会使它成为单线与 2,3,4...
    • “否则我必须创建一个 DJ 实例并像分配任何其他对象一样分配值。” - 不确定我是否理解该声明。如果您已经有一个自定义的可延迟对象(实现#perform 的对象),那么您可以毫不费力地将您的 :owner_id 和 :owner_type 字段添加到其中,不是吗?
    【解决方案2】:

    其他答案可能有用,但它们没有回答问题。要将自定义列添加到 delayed_jobs 表,您可以关注 this steps。我这样做并成功地创建了Delayed::Job 和其他对象之间的关联。

    【讨论】:

      【解决方案3】:

      另一种选择是在初始化程序中简单地添加以下行(例如 config/initializers/delayed_job.rb):

      Delayed::Job.attr_accessible :owner_type, :owner_id
      

      【讨论】:

        猜你喜欢
        • 2016-05-26
        • 2020-08-26
        • 1970-01-01
        • 2021-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多