所以我有很多數據庫操作,我把我想要在後臺做的幫手。作爲一個例子,我在我的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
嗯這看起來不錯,並創建一個延遲的工作。但是,它執行時,它不會正確完成record_activity(即沒有創建活動記錄) - 但也不會產生任何錯誤,因此作業從delayed_jobs表中消失。延遲工作有什麼限制?有什麼建議嗎?這裏的延遲問題是否是問題? – jay 2012-02-22 20:50:55
@jay:你是否重新啓動了你的延遲工作?他們不會自動重新加載任何東西。 「record_activity」是什麼樣的?沒有'delay'調用它能正常工作嗎? – 2012-02-22 21:05:43
已重新開始測試。會爲問題添加record_activity(以及我測試過的變體)。 – jay 2012-02-22 21:24:31