2016-06-09 51 views
1

我在鐵路項目上使用mongoid gem,我很難通過嘗試在內存中修改模型但是從不保存它,所以我不修改數據庫。我試圖修改從內存中加載一個模型的屬性,但它不工作,如波紋管:如何在內存中安全地修改mongoid模型?

mymodel = MyModel.where('some criteria') 
mymodel.first.some_attribute = 0 
mymodel.first.some_attribute == 0 -> is false 

所以我每次我們先做,甚至在每次進入循環時間猜蒙戈重新加載從DB和設置一些屬性沒有任何作用,如果我再次循環,我設置的所有屬性仍然設置爲原始值。有沒有辦法提交交易並強制mymodel保持加載到內存中?我很難使用正確的術語,所以我希望你明白我的意思。

回答

1

調用first是一個查詢,所以這是兩個不同的查詢:

M.first 
M.first 

和兩支安打到數據庫中產生兩種完全不同的模型實例。同樣,調用M.each { ... }(或其他一些迭代方法)兩次將觸發數據庫兩次,並生成兩組完全不同的模型實例。你可以看看#object_id說什麼來驗證這一點。

如果要加載的對象和做的事情對他們那麼顯式地說明:

m = M.first 
m.attr = 0 
# Now m.attr == 0 will be true and you can m.save to update the database 

和迭代,你可以調用#to_a執行查詢,並從拉了一堆模型實例數據庫到本地內存:

毫秒= M.some_query.to_a ms.each {...} ms.each {...}#循環相同的模型實例作爲第一ms.each

+0

Thx,那是我的觀察但我認爲做ms = M.where('某些標準'); ms.each {...}將迭代查詢的實例,但它尚未解析,並且每次都執行查詢。 –

+1

'ms'只是在這種情況下的一個查詢,'ms.each {...}'不會自動解析並隱藏查詢,它只是執行查詢並像遊標一樣遍歷結果;例如,如果您在迭代時修改(例如,'ms.each {| m | m.attr = 6; m.save}'),我就會看到這個結果有趣的結果,除非您在整個迭代過程中有明確的順序。 –

相關問題