2012-03-16 17 views
7

Tôi cần chuyển đổi tài liệu được nhúng vào bộ sưu tập của riêng nó, vì vậy nó có thể được tham chiếu từ bộ sưu tập khác.Mongoid: chuyển đổi tài liệu nhúng thành bộ sưu tập được tham chiếu/riêng

Giả sử tôi có số Parent nhúng nhiều số Childs. Tôi đã nghĩ về điều gì đó dọc theo điều này:

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 

Đây có phải là một lựa chọn không? Lý tưởng nhất tôi sẽ chạy điều này trong một giao diện điều khiển và tôi sẽ chỉ thay đổi ánh xạ mongoid từ embed_* thành has_*, vì vậy tôi sẽ không cần phải thay đổi phần còn lại của mã của tôi hoặc sử dụng một bộ sưu tập khác như dàn dựng.

Trả lời

9

Tôi nghĩ rằng, các mã nên trông như thế này (không kiểm tra)

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 

Sau đó, bạn có thể thay đổi bạn embeds_many-has_many và (hy vọng) nó sẽ làm việc tốt.

+0

Cảm ơn, tôi sẽ thử! –

+0

Hãy cho tôi biết nếu nó hoạt động :) –

+0

Vâng, nó hoạt động! Cảm ơn một lần nữa. –

6

quá ít đại diện để nhận xét, nhưng tôi nghĩ câu trả lời của Sergio (nếu không rất hữu ích) có thể đã lỗi thời. Với mongoid 3.0.5 Tôi không thể sử dụng

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

nhưng thay vì sử dụng

child_coll = Mongoid.default_session[:children]

đó đã làm các trick cho tôi

0

Đối với tôi, tôi cần phải loại bỏ các '_id 'thuộc tính trước khi chèn nếu không tôi sẽ nhận được lỗi khóa trùng lặp.