2012-04-19 79 views
0

怪異的行爲邏輯,我由TOBI做delayed_job的,當我運行的delayed_job但fbLikes算全錯,它似乎我每增加一個公司的時間遞增。不確定邏輯錯誤。該fbLikes方法我之前測試和它的工作(之前我改的delayed_job) 不知道這裏的「1」從何而來?Ruby on Rails的 - 通過推遲任務

[輸出]

coca-cola 
http://www.cocacola.com 
Likes: 1 <--- Not sure why the fbLikes is 1 and it increment with second company fbLikes is 2 and so on... 

[Worker(host:aname.local pid:1400)] Starting job worker 
[Worker(host:aname.local pid:1400)] CountJob completed after 0.7893 
[Worker(host:aname.local pid:1400)] 1 jobs processed at 1.1885 j/s, 0 failed ... 

我運行在模型中的delayed_job並試圖運行的 計數Facebook的工作喜歡

這裏是我的代碼。 [LIB/count_rb.job]

require 'net/http' 
    class CountJob< Struct.new(:fbid) 

def perform 
    uri = URI("http://graph.facebook.com/#{fbid}") 
    data = Net::HTTP.get(uri) 
    return JSON.parse(data)['likes'] 
end 
end 

[公司模型]

before_save :fb_likes 
def fb_likes    
    self.fbLikes = Delayed::Job.enqueue(CountJob.new(self.fbId)) 
end 

回答

0

問題從

before_save :fb_likes 
def fb_likes 
    self.fbLikes = Delayed::Job.enqueue(CountJob.new(self.fbId)) 
end 

傳來的排隊方法將不會返回運行CountJob結果。我相信無論工作是否成功排隊,以及何時將其保存到fb_likes值,它將在作業成功排隊時評估爲1。

你應該正在由delayed_job的運行還不如排隊調用的結果工作內部設置fbLikes。

before_save :enqueue_fb_likes 
def fb_likes 
    Delayed::Job.enqueue(CountJob.new(self.fbId)) 
end 

你執行的CountJob類可能應該採取ID型方法,爲您查找並有機會獲得FBID和fbLikes屬性,而不是僅僅採取FBID。

class CountJob< Struct.new(:id) 

def perform 
    company = Company.find(id) 
    uri = URI("http://graph.facebook.com/#{company.fbid}") 
    data = Net::HTTP.get(uri) 
    company.fbLikes = JSON.parse(data)['likes'] 
    company.save 
end 
+0

您好,感謝您的答覆。我不可能找到公司ID,因爲它目前還沒有保存。所以我不能使用company.find(id)來指定搜索。 – 2012-04-19 23:26:26

+0

任何想法如何解決此事? – 2012-04-21 11:41:21

+0

如果您在保存之前必須有相同的計數,那麼我不確定使用後臺作業對您來說是最合適的。後臺作業是用於處理需要很長時間的事情,並且不需要立即完成,以便正確處理請求/操作。 – jalvarado 2012-05-01 15:50:19