2012-03-16 69 views
7

我需要將嵌入文檔轉換爲其自己的集合,以便可以從其他集合中引用它。Mongoid:將嵌入文檔轉換爲引用/自己的集合

假設我有一個Parent嵌入了許多Childs。 我在想這件事:

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_*的mongoid映射更改爲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

謝謝,我會試試看! – 2012-03-16 00:33:26

+0

讓我知道它是否有效:) – 2012-03-16 00:34:20

+0

是的,它的工作原理!再次感謝。 – 2012-03-16 00:57:49

6

回覆評論太少,但我認爲塞爾吉奧的答案可能已經過時了。隨着mongoid 3.0.5我不能使用

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

而是使用

child_coll = Mongoid.default_session[:children]

這奏效了,我

0

對我來說,我需要刪除「_id '之前插入的屬性,否則我會得到重複鍵錯誤。

相關問題