使用導軌控制檯我創建了一個模型記錄,然後檢索使用一個新的變量和更新一些領域:
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"
爲什麼?
使用導軌控制檯我創建了一個模型記錄,然後檢索使用一個新的變量和更新一些領域:
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"
爲什麼?
默認情況下,Rails模型爲'Dirty',這意味着屬性設置函數attribute=()
將該屬性標記爲已更改,並告訴Rails在下次保存時更新此屬性。此信息存儲在模型上,而不存儲在數據庫中。在var.save
上,Rails僅更新它知道已更改的屬性。如果認爲沒有任何變化,Rails不會檢查數據庫中的差異(這在生產環境中會非常慢)。
您可以使用var.reload
重新加載從數據庫屬性到相應的對象。
編輯:爲了澄清上面提出的意見,你應該在你的測試代碼中使用MyModel.last
而不是MyModel.first
。如果您在數據庫中有超過一排,MyModel.first
將不參考最近保存的對象,因此var2
和var
將涉及到完全不同的對象。
明白了,謝謝!此外,'最後'與'第一個'問題是有道理的,我只是指這個虛擬示例只有一個條目,但我會編輯 – Max
酷。如果這個答案回答你的問題,你應該用綠色的勾號接受它。乾杯。 –
也許你是不是節省了正確的記錄?試試'var2 = MyModel.last' – David
Johnny Grass可能是對的。要進一步調試,請查看log/development.log,它將會執行所有的SQL語句,並可能幫助您更好地理解正在發生的事情。 –
我試圖保存完全相同的記錄。更多信息:如果我將'var.name'更改爲其他內容,那麼運行'var.save'就可以正確調用SQL UPDATE命令。只有當'var'保持不變時纔會發生這種情況。好像有些東西在追蹤'var'的狀態,並且'var.save'如果狀態沒有改變則什麼也不做。我的問題是:如何檢查'var'的狀態,而不是'var'代表的'MyModel'中記錄的狀態? – Max