2012-04-06 165 views
4

我有一個Post模型(下面),它有一個回調方法來通過延遲作業修改主體屬性。如果我刪除「延遲」。並執行#shorten_urls!瞬間,它工作正常。但是,從延遲工作的角度來看,它不會保存更新的主體。Rails /延遲作業:無法從延遲作業中保存模型

class Post < ActiveRecord::Base 
    after_create :shorten_urls 

    def shorten_urls 
    delay.shorten_urls! 
    end 

    def shorten_urls! 
    # this task might take a long time, 
    # but for this example i'll just change the body to something else 
    self.body = 'updated body' 
    save! 
    end 
end 

奇怪的是,工作是沒有任何問題的處理:

[Worker(host:dereks-imac.home pid:76666)] Post#shorten_urls! completed after 0.0021 
[Worker(host:dereks-imac.home pid:76666)] 1 jobs processed at 161.7611 j/s, 0 failed ... 

然而,身體不更新。任何人都知道我在做什麼錯了?

- 編輯 -

每Alex的建議,我已經更新的代碼看起來像這樣(但無濟於事):

class Post < ActiveRecord::Base 
    after_create :shorten_urls 

    def self.shorten_urls!(post_id=nil) 
    post = Post.find(post_id) 
    post.body = 'it worked' 
    post.save! 
    end 

    def shorten_urls 
    Post.delay.shorten_urls!(self.id) 
    end 
end 
+2

對此的任何解答?目前遇到同樣的問題... – 2012-05-02 15:29:38

+0

任何解決方案?有沒有更簡單的方法來做到這一點? – Alex 2012-06-05 19:21:59

+0

@imderek你找到了這個問題的解決方案嗎? – user664833 2012-09-27 19:28:21

回答

1

其中一個原因可能是self是當您將方法傳遞給delay時,未正確序列化。嘗試使shorten_urls!成爲一個類記錄標識並從數據庫中提取記錄的類方法。

+0

K,看看我上面的編輯。我做了你的建議,儘管它違背了邏輯,但它仍然沒有不更新帖子。 – imderek 2012-04-06 21:32:19