2012-02-22 19 views
1

所以我有很多數據庫操作,我把我想要在後臺做的幫手。作爲一個例子,我在我的Users助手中定義了一個record_activity方法。當帖子被創建我要記錄這一活動,即在創建方法的帖子控制器:延遲用戶定義的幫助器方法delayed_job

def create 
    #operations to save the post 
    record_activity(user, post) 
end 

出於性能方面的原因,我不想耽誤這record_activity等人,並與在後臺運行的工人他們結束。我使用delayed_job來延遲郵件發送者,並且效果很好。在Rails控制檯,method.delay的偉大工程,即我軌控制檯可以這樣做:

record_activity.delay 

然而,同樣.delay不寫在一個控制器工作時,即下面仍然運行現場,沒有延遲:

def create 
    #operations to save the post 
    record_activity(user, post).delay 
end 

這是爲什麼?我在一個應用程序中使用Rails 3.0.9,在另一個應用程序中使用Rails 3.1.3,另外我還使用了delayed_job 2.1.4版。

任何人都可以建議如何使這項工作?

編輯*

我認爲mu_is_too_short提供的答案是正確的道路。它會創建一個延遲的作業,只是它不會正確執行record_activity方法。當delayed_job工作者啓動時,它執行delayed_job並且沒有錯誤,並且如同它的工作一樣刪除記錄。但沒有活動被記錄。給予一定的情況下,這裏是電話和方法我現在故障排除:

self.delay.record_activity(user, @comment) 

和方法:

def record_activity(current_user, act) 
    activity = Activity.new 
    activity.user_id = current_user.id 
    activity.act_id = act.id 
    activity.act_type = act.class.name 
    activity.created_at = act.created_at 
    activity.save 
end 

我當時想,也許我無法通過傳遞用戶變量,這種情況下,所以我試圖只傳遞整數值等等。我重新啓動的delayed_job工作者和嘗試這些方法,都無濟於事:

self.delay.record_activity(user.id, @comment.id, @comment.class.name, @comment.created_at) 

和更改方法:

def record_activity(current_user_id, act_id, act_type, act_created_at) 
    activity = Activity.new 
    activity.user_id = current_user_id 
    activity.act_id = act_id 
    activity.act_type = act_type 
    activity.created_at = act_created_at 
    activity.save 
    end 

回答

2

我不認爲在控制檯record_activity.delay工作你認爲它是這樣的。這將執行record_activity之前delay有機會做任何事情。

delay調用必須先走,然後你打電話給你延遲的方法是什麼delay回報:

def create 
    self.delay.record_activity(user, post) 
end 

delay調用將返回它可以攔截所有的方法調用(可能通過method_missing)的對象,YAMLizes他們,並將YAML添加到其在數據庫中的延遲作業隊列表中。所以,只是說record_activity.delay沒有做任何有用的事情,它只是執行record_activity,創建了延遲作業攔截器對象,並丟棄了什麼delay創建。

+0

嗯這看起來不錯,並創建一個延遲的工作。但是,它執行時,它不會正確完成record_activity(即沒有創建活動記錄) - 但也不會產生任何錯誤,因此作業從delayed_jobs表中消失。延遲工作有什麼限制?有什麼建議嗎?這裏的延遲問題是否是問題? – jay 2012-02-22 20:50:55

+0

@jay:你是否重新啓動了你的延遲工作?他們不會自動重新加載任何東西。 「record_activity」是什麼樣的?沒有'delay'調用它能正常工作嗎? – 2012-02-22 21:05:43

+0

已重新開始測試。會爲問題添加record_activity(以及我測試過的變體)。 – jay 2012-02-22 21:24:31

相關問題