2012-05-24 59 views
2

使用導軌控制檯我創建了一個模型記錄,然後檢索使用一個新的變量和更新一些領域:
Rails:如果調用兩次,保存不更新記錄?

var = MyModel.new 
var.name = "my name" 
var.save 

var2 = MyModel.last 
var2.name = "your name" 
var2.save 

現在要回舊變量var.save只是返回true並不會覆蓋name場它的價值:"my name"

爲什麼?

+3

也許你是不是節省了正確的記錄?試試'var2 = MyModel.last' – David

+0

Johnny Grass可能是對的。要進一步調試,請查看log/development.log,它將會執行所有的SQL語句,並可能幫助您更好地理解正在發生的事情。 –

+0

我試圖保存完全相同的記錄。更多信息:如果我將'var.name'更改爲其他內容,那麼運行'var.save'就可以正確調用SQL UPDATE命令。只有當'var'保持不變時纔會發生這種情況。好像有些東西在追蹤'var'的狀態,並且'var.save'如果狀態沒有改變則什麼也不做。我的問題是:如何檢查'var'的狀態,而不是'var'代表的'MyModel'中記錄的狀態? – Max

回答

3

默認情況下,Rails模型爲'Dirty',這意味着屬性設置函數attribute=()將該屬性標記爲已更改,並告訴Rails在下次保存時更新此屬性。此信息存儲在模型上,而不存儲在數據庫中。在var.save上,Rails僅更新它知道已更改的屬性。如果認爲沒有任何變化,Rails不會檢查數據庫中的差異(這在生產環境中會非常慢)。

您可以使用var.reload重新加載從數據庫屬性到相應的對象。

編輯:爲了澄清上面提出的意見,你應該在你的測試代碼中使用MyModel.last而不是MyModel.first。如果您在數據庫中有超過一排,MyModel.first將不參考最近保存的對象,因此var2var將涉及到完全不同的對象。

+0

明白了,謝謝!此外,'最後'與'第一個'問題是有道理的,我只是指這個虛擬示例只有一個條目,但我會編輯 – Max

+0

酷。如果這個答案回答你的問題,你應該用綠色的勾號接受它。乾杯。 –

相關問題