2012-03-14 12 views
2

我一直試圖讓DelayedJob在後臺運行一些用戶定義的方法。對於此測試情況下,我在一個輔助定義了以下方法:Delayed_job不會運行用戶定義的方法

def test_case 
    u = User.new 
    u.first_name = "JimBob" 
    u.last_name = "joe" 
    u.email = "[email protected]" 
    u.password = "sailsJ123" 
    u.password_confirmation = "sailsJ123" 
    u.save 
    end 

然後,在控制器動作,我定義:

def action_name 
    #whatever it does outside of this 
    test_case 

    end 

這導致test_case創建新用戶時的動作這裏是跑。如果我儘量拖延這項工作,我將其更改爲:

def action_name 
    #whatever it does outside of this 
    self.delay.test_case 
    end 

這將導致delayed_job的被創建,但有一些跡象表明,我這樣做是錯誤的:具體而言,在delayed_job的表格處理程序包含了所有在action_name中的其他地方加載的信息(在這種情況下是一個大約50000個字符的大文件),而不僅僅是指定運行test_case或其他東西的簡單處理程序。

如果我改變這個局面,保持測試,我試圖做:

def action_name 
    #whatever it does outside of this 
    u = User.new 
    u.first_name = "JimBob" 
    u.last_name = "joe" 
    u.email = "[email protected]" 
    u.password = "sailsJ123" 
    u.password_confirmation = "sailsJ123" 
    u.delay.save 
    end 

這成功地創建了一個DJ,正如預期的,它加載的處理程序指定細節(例如u.name => 「JimBob」 ......)。但是,當作業運行時,不會創建新用戶。我甚至試圖切換它只是爲了摧毀一個用戶(我可能創建一個用戶與DJ可能很難,考慮到密碼字段的處理方式),但這是行不通的。

SO長話短說:

  1. 我怎樣才能得到DJ正常運行背景的方法呢?
  2. 在創建看起來很簡單的延遲作業的情況下,如何不對數據庫進行更改?
+0

什麼是DJ處理程序對象和方法名稱? – AMIT 2012-03-14 05:27:06

+0

@AMIT它只是「延遲工作」的縮寫。 – Roshan 2018-01-23 10:04:06

回答

0

這並不表明,什麼是錯的:

的delayed_job的表包含在其他地方加載的所有信息ACTION_NAME

將在此情況下,因爲你可以預期這樣說:

self.delay.test_case 

and self是happ必須擁有params以及您可能不關心的各種其他材料; DJ將不得不序列化self以便爲test_case運行提供適當的上下文。也許你遇到了一個大的文件夾限制在self的地方。

我認爲你的第二個「打電話delay在別的東西」方法正在朝着正確的方向前進。

你可以嘗試詢問一個作業類:

class ItsAJob 
    def perform 
     u = User.new 
     u.first_name = "JimBob" 
     u.last_name = "joe" 
     u.email = "[email protected]" 
     u.password = "sailsJ123" 
     u.password_confirmation = "sailsJ123" 
     u.save 
    end 
end 

# and elsewhere... 
Delayed::Job.enqueue(ItsAJob.new) 

或者嘗試使你的方法一類方法,這樣就可以.delay一類:

class YourController 
    def action_name 
     self.class.delay.test_case 
    end 

    def self.test_case 
     u = User.new 
     u.first_name = "JimBob" 
     u.last_name = "joe" 
     u.email = "[email protected]" 
     u.password = "sailsJ123" 
     u.password_confirmation = "sailsJ123" 
     u.save 
    end 

0

您不能耽誤#保存ActiveRecord模型,因爲DJ會在執行操作之前嘗試從數據庫中重新加載模型。所有的數據都將丟失。相反,使用創建用戶的#perform方法創建一個Job類。

+0

請你詳細說明一下嗎? – Alex 2012-06-05 19:39:55

+0

當您在ActiveRecord對象上延遲一個方法時,DJ只是將方法,類名稱和ID寫入隊列。作業運行時,實際的對象由id通過數據庫加載。由於它是新鮮加載的,對象中未持久保存到數據庫的任何狀態都將丟失。以這種方式延遲對模型的更新將是無效的。 – betamatt 2012-06-06 20:42:42

相關問題