2012-03-09 3 views
0

私は としたい1.データベースからオブジェクト1とオブジェクト2を取得する(それぞれ2つともhas_many関連を持つ) 2.オブジェクト1のクローンであるオブジェクト3を作成し、したがって、関連付けはまだありません 2.オブジェクト2の関連付けを複製して、オブジェクト3の関連付けに追加します 3.メモリ の操作に新しいオブジェクト3を使用します4.データベースを永久に変更しないでプロセスを終了します - オブジェクト1およびオブジェクト2プロセスが終了しても依然として元の関連がありますメモリ内での操作のためのmongoマッパーの関連付けの重複

代わりに何が起きているのですか

  1. 私がオブジェクト1のクローンであり、従って、まだ
  2. 全く関連を持たないオブジェクト3を作成し、データベースからオブジェクト1及びオブジェクト2(両方とも2つのにhas_manyアソシエーションそれぞれを有する)
  3. をつかむIは、オブジェクト2の重複オブジェクト3の関連付けに追加する
  4. 私はメモリ内の操作に新しいオブジェクト3を使用します
  5. 私はプロセスを終了しましたが、データベースに永続的な変更がありました。オブジェクト2には関連がありません。 (Temporary)オブジェクト3 idに変更されました。

ここは私のコードです。 all.last.association1が、私は空の配列を取得:すべては私が言うとき、今では

object1 = all.last.clone #we take the most recently created object 
all.each do |instance| 
    instance_association1 = (instance.association1).dup 
    object1.association1 += instance_association1 #BUG this moves the association 
    object1.association1.uniq! 
    instance_association2 = (instance.association2).dup 
    object1.association2 += instance_association2 
    object1.association2.uniq! 
end 

注内のオブジェクトの任意の#を持つ配列が含まれていることに注意してください。

ヘルプ!

答えて

1

MongoMapperの関連付けは、保存によって少し過度になる場合があります。私はいつかそれを見直したいが、それは簡単な問題ではない。

保存のタイミングを教えてくれるコードは、many_documents_proxy.rbです。 my_association = [...]を実行するときは、replaceが呼び出されます。アレイへのすべての関連ドキュメントを

より一般的に
tmp = all.last.clone 
all.each do |instance| 
    instance.association1.each { |doc| tmp.association1.build(doc.attributes) } 
    tmp.association1.uniq! 
    # ... 
end 

、あなたが変換することができます:あなたがそうのような一時的なオブジェクトを構築することができるかもしれので

任意の節約をしない唯一の方法は、buildです省エネを心配することはありません。

associations1 = [] 
associations2 = [] 
all.each do |doc| 
    associations1 += doc.associations1.to_a 
    associations2 += doc.associations2.to_a 
end 
assocations1.uniq! 
assocations2.uniq! 

いずれにしても、気をつけてください! Rubyのuniqメソッドは、Rubyの#hashメソッドを使用して同等性を計算しているようですが、この場合は結果が得られない場合があります。いくつかのテストを実施して、my_obj.hash == my_obj2.hashmy_obj == my_obj2の場合はそれを確認してください。 #hashメソッドを実装する方法については、必要なルートの場合はthis discussionを参照してください。

関連する問題