2010-11-23 11 views
2

汚れたオブジェクトを追跡する必要がありました。そしてそれは親の docとうまく動作します。しかし、埋め込みまたは参照されたdocを変更すると、ダーティーな には、埋め込み/参照されたdoc自体を介してアクセスする必要があります。Mongoidの親文書に埋め込まれたドキュメントのダーティトラッキング

親ドキュメントの汚れを追跡するにはどうすればよいですか?

答えて

1

私は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 

:しかし、それはこのようなものが埋め込まれた文書の基本的な汚い追跡を自分で実装するのは難しいことではありませんchangeschanged?の方法がありますが、これらの機能が絶対に必要な場合を除き、私はこれを行いません。私はこの問題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 
+0

お返事ありがとうございます。そのほとんど私はいくつかの余分なものが欲しかった。 – Autodidact

+0

私が欲しいのは、fooが変わるたびに、私はbar.changedを介して知りたいのですか?これらの値を与えるbar.changes。あなたが言ったように、私の必要性は変更を無効にして変更するよう求めますか?メソッド。しかし、それを行う方法? – Autodidact

+0

上記の更新された回答をご覧ください。ただし、 'changes'と' changed? 'をオーバーライドするときは注意してください。複雑な文書では、奇妙なことが起こる可能性があります。モンゴイドが汚れた属性だけを追跡し、汚い関連を追跡しない理由があります。 – bowsersenior

2

は、ここで埋め込まれた文書に変更何追跡する方法です。それはmongoidが属性に対して行うのと同様の方法で文書の関係の変化を単に追跡するので、タイムスタンプとバージョンは正しく更新されます。

+0

これはモンゴイド6とレール5では機能しません。 –

関連する問題