2012-08-28 239 views
3

有人可以告诉我如何扩展delayed_jobs gem以允许添加几个自定义列吗?将自定义列添加到delayed_jobs表

我添加了一对列,但,当我尝试“干净”使用它们,我得到:

无法大规模指派保护的属性: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** 

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

任何提示赞赏。

回答

1

你真的需要延长delayed_jobs表吗?我的方法是放弃它,并使用以下两种技术之一:

  • 将owner_id和owner_type字段添加到正在排队的对象。
  • 使用:belongs_to与delayed_jobs的关系创建单独的表格。然后你用DJ的钩子让这两个人在整个工作过程中保持同步。

第一种方法比较简单,但不适合每种情况。这两种方法都适合你吗?

+0

我可能走这条路 - 但其他开发者已经添加了列。我想通过延迟访问这些列(:owner_id => etc ...)。否则,我必须创建一个DJ实例,并按照其他任何对象来分配值。这很好,但向宝石添加一些代码会使其成为单线程与2,3,4 ... – Northband

+0

“否则,我必须创建一个DJ实例,并按照其他任何对象分配值“。 - 不知道我理解那个声明。如果你已经有了一个自定义延迟对象(一个实现了#perform),那么你可以添加你的:owner_id和:owner_type字段,没有额外的努力,不是吗? –

1

另一种选择是简单地添加下面一行在你的初始化(EX配置/初始化/ delayed_job.rb):

Delayed::Job.attr_accessible :owner_type, :owner_id 
1

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

相关问题