2012-03-16 13 views
7

埋め込みドキュメントを別のコレクションから参照できるように、埋め込みドキュメントを独自のコレクションに変換する必要があります。Mongoid:埋め込みドキュメントを参照/独自のコレクションに変換する

Childsが埋め込まれたParentがあるとします。 私はこれに沿って何かを考えていた:

Parent.all.each do |p| 
p.childs.all.each do |c| 
    c.raw_attributes['parent_id'] = p.id 
end 
p.save! #will save parent and cascade persist all childs onto their own coll 
end 

これはオプションですか?理想的には私はコンソールでこれを実行し、モンゴイイのマッピングをembed_*からhas_*に変更するだけなので、残りのコードを変更するか、ステージングとして別のコレクションを使う必要はありません。

答えて

9

私は、コードは(テストしていない)より、次のようにその後

child_coll = Mongoid.database.collection('children') 

Parent.all.each do |p| 
    p.childs.all.each do |c| 
    c.attributes['parent_id'] = p.id 

    child_coll.insert c.attributes # save children to separate collection 
    end 

    p.childs = nil # remove embedded data 
    p.save 
end 

を見なければならない、あなたはembeds_manyhas_manyにを変更することができますし、(できれば)それがうまく動作するはずだと思います。

+0

ありがとう、私は試してみるつもりだ! –

+0

それが働いたら教えてください:) –

+0

うん、それは動作します!再度、感謝します。 –

6

コメントする人が少なすぎますが、セルジオの(それ以外の場合は非常に役立つ)回答は時代遅れかもしれないと思います。 mongoid 3.0.5で、私は

child_coll = Mongoid.database.collection('children')

を使用する代わりに、私は「_idを削除する必要が私のために私

0

のためのトリックをした

child_coll = Mongoid.default_session[:children]

使用ができませんでした'属性を挿入しないと、重複したキーエラーが発生します。

関連する問題