2010-09-01 49 views
4

在我的Rails應用程序中,我嘗試使用update_attributeafter_create回調中更新模型的屬性。我可以成功更新屬性,但出於某種原因,當我這樣做時,所有模型的其他屬性也會更新。因此,即使模型的名稱屬性(例如)沒有更改,它也會在數據庫更新查詢中設置爲當前值。在創建回調後更新屬性會導致更新整個記錄

這是Rails(2.3.8)中的預期行爲,還是我做錯了什麼?

+0

你可以發佈你的after_create代碼嗎? – 2010-09-01 15:54:48

回答

4

是的我相信這是一致的行爲,因爲剛剛創建的模型實例尚未重新加載。因此'已更改'屬性沒有被重置。

對不起,如果這不是一個非常明確的解釋。爲了演示,在你的after_create方法中運行調試器。例如。

def my_after_save_callback 
    require 'ruby-debug'; debugger 
    update_attribute(:foo, "bar") 
end 

然後,當調試器開始運行:

p self.changed 

已經修飾該對象將被返回的所有屬性的數組。 ActiveRecord會在下一次保存對象時更新所有這些屬性。

解決此問題的一個方法是在更新屬性之前重新加載對象。

def my_after_save_callback 
    reload 
    update_attribute(:foo, "bar") 
end 

這將重置'changed'屬性,只有您修改的特定屬性將在SQL查詢中更新。

希望有道理:-)