2012-08-28 139 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與其他對象之間的關聯。

相關問題