汚れたオブジェクトを追跡する必要がありました。そしてそれは親の docとうまく動作します。しかし、埋め込みまたは参照されたdocを変更すると、ダーティーな には、埋め込み/参照されたdoc自体を介してアクセスする必要があります。Mongoidの親文書に埋め込まれたドキュメントのダーティトラッキング
親ドキュメントの汚れを追跡するにはどうすればよいですか?
汚れたオブジェクトを追跡する必要がありました。そしてそれは親の docとうまく動作します。しかし、埋め込みまたは参照されたdocを変更すると、ダーティーな には、埋め込み/参照されたdoc自体を介してアクセスする必要があります。Mongoidの親文書に埋め込まれたドキュメントのダーティトラッキング
親ドキュメントの汚れを追跡するにはどうすればよいですか?
私はMongoid自身の汚れた属性が埋め込み文書の変更を追跡するとは思わない。あなたはより多くのオプションが必要な場合は、Bar.changes
に埋め込まれた文書の変更を含む、または特定の変更を追跡するように、あなたは上書きする必要があります
class Bar
include Mongoid::Document
embeds_many :foos
attr_accessor :foos_changed
alias_method :foos_changed?, :foos_changed
# ...
end
class Foo
include Mongoid::Document
embedded_in :bar, :inverse_of => :foos
after_save :notify_parent
def notify_parent
bar.foos_changed = true
end
# ...
end
b = Bar.create
b.foos_changed? # => nil
b.foos.create
b.foos_changed? # => true
:しかし、それはこのようなものが埋め込まれた文書の基本的な汚い追跡を自分で実装するのは難しいことではありませんchanges
とchanged?
の方法がありますが、これらの機能が絶対に必要な場合を除き、私はこれを行いません。私はこの問題https://github.com/versative/mongoid_relations_dirty_trackingを解決するために一緒にmongoid拡張を入れている
class Bar
include Mongoid::Document
embeds_many :foos
attr_writer :embedded_changes
def embedded_changes
@embedded_changes ||= begin
self._children.inject({}) do |memo, child|
memo.merge(
{child.collection_name => {child.id => child.changes}}
) if child.changed?
end
end
end
def changes
original_value = super
if original_value.blank?
embedded_changes
else
original_value.merge(embedded_changes)
end
end
def changed?
super || self._children.any?(&:changed?)
end
# ...
end
class Foo
include Mongoid::Document
embedded_in :bar, :inverse_of => :foos
# ...
field :hat
end
b = Bar.create
f = b.foos.create
b.changes # => nil
b.changed? # => false
f.hat = 1
f.changes # => {"hat"=>[nil, "1"]}
b.changes # => {"foos"=>{BSON::ObjectId('4cf...')=>{"hat"=>[nil, "1"]}}}
b.changed? # => true
:
は、ここで埋め込まれた文書に変更何追跡する方法です。それはmongoidが属性に対して行うのと同様の方法で文書の関係の変化を単に追跡するので、タイムスタンプとバージョンは正しく更新されます。
これはモンゴイド6とレール5では機能しません。 –
お返事ありがとうございます。そのほとんど私はいくつかの余分なものが欲しかった。 – Autodidact
私が欲しいのは、fooが変わるたびに、私はbar.changedを介して知りたいのですか?これらの値を与えるbar.changes。あなたが言ったように、私の必要性は変更を無効にして変更するよう求めますか?メソッド。しかし、それを行う方法? – Autodidact
上記の更新された回答をご覧ください。ただし、 'changes'と' changed? 'をオーバーライドするときは注意してください。複雑な文書では、奇妙なことが起こる可能性があります。モンゴイドが汚れた属性だけを追跡し、汚い関連を追跡しない理由があります。 – bowsersenior