在Mongoid中,將文檔推入embeds_many
關係會自動將文檔保留到數據庫中。通常情況下,這很好,但當我需要跟蹤對嵌入式文檔的更改時遇到問題。Mongoid embeds_many:推送文檔而不保存以保留髒狀態
假設你有兩種型號:
class List
include Mongoid::Document
embeds_many :items
field :title
end
class Item
include Mongoid::Document
embedded_in :list
field :name
end
這正好和.changes屬性:
list = List.new(title: 'List title')
list.save #list is now persisted
item = Item.new(name: 'Item name')
item.changes #returns Hash with {'name' => [nil, 'Item name']}
list.items << item #saves item to database under the hood
item.changes #returns empty Hash, because item was autosaved with list
我可以用item.previous_changes
檢查是共推項目進入榜單前所做的更改,但在我的具體情況下,這會給我帶來各種麻煩,讓事情變得易於管理。
我想什麼來實現的,是能夠初始化一個Item
文檔,然後而不立即將它保持它(通過<<
或push
)添加到list
。
我知道,Mongoid確實提供了一個選項來設置embeds_many
關係沒有持續性(見http://mongoid.org/en/mongoid/docs/relations.html#embeds_many):
list.items.build(name: 'Another item')
的問題存在着Mongoid爲您創建項目實例。在我的情況下,embeds_many
關係中的文檔可能是項目的子類(例如SpecialItem < Item
),這對於build
不起作用。但如果有人知道解決這個限制的方法,我也很樂意接受它作爲答案。