2015-08-26 41 views
2

後,我註冊了一個after_commit觸發我的Active Record實體之一,像這樣:Rails的活動記錄具有零ID提交

class Work < ActiveRecord::Base 
    after_commit :on_work_commit 

    ... 

    def on_work_commit 
     puts self.id # prints nil sometimes 
    end 
end 

的問題是,在我的生產環境,self.id有時是零 在on_work_commit方法中。它不會一直髮生,事實上,它會間歇性地發生。通過分析這些錯誤的堆棧跟蹤,我可以看到它們在工作創建操作期間間歇性地發生,但從未在更新工作時發生。我無法在本地重現此問題,因爲它僅在生產時發生,同時正在創建和更新大量作品。

這種問題尖叫我的競爭條件,但我不知道什麼可能是錯的。在對象可以獲得一個id之前,是否有任何可以爲一個對象調用after_commit觸發器的場景?

我正在使用rails版本3.2.22和ruby版本1.9.3-p484。

+0

您是否找到解決方案? – Kris

+0

還沒有!我們現在無視它,稍後會回來。一旦找出原因,我會盡快更新。 – Tavio

+0

您的測試是否包含在事務中,例如'use_transactional_fixtures'或數據庫清理事務策略。更改截斷可能會有所幫助。但是如果你的after_commit被解僱了,你不能在交易中包裝你的測試...... – Kris

回答

5

after_commit方法還執行了destroy行動,這就是爲什麼它返回nil,當你試圖刪除的項目,這樣做反而

after_commit :on_work_commit, on: [:create, :update] 

我會建議你使用after_save用於此目的

after_save :on_work_commit 

希望有幫助!

+1

不幸的是,這些錯誤與銷燬行爲無關。工作實體具有確保它永不被銷燬的機制,而是被軟刪除。此外,當工作的id爲nil時,on_work_commit方法中的代碼會引發錯誤,這會生成一個堆棧跟蹤,告訴我在創建工作時發生錯誤。 – Tavio

+0

嘗試使用after_save代替 – RSB