2012-03-16 14 views
7

ho bisogno di convertire un documento incorporato su una propria collezione, in modo che possa essere referenziato da un'altra raccolta.Mongoid: convertire documento incorporato in riferimento/propria collezione

Supponiamo di avere un Parent che incorpora molti Childs. Stavo pensando a qualcosa di lungo questa:

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 

È questo un'opzione? Idealmente mi eseguire questo in una console e vorrei solo cambiare le mappature mongoid da embed_* a has_*, quindi non avrei bisogno di cambiare il resto del mio codice o utilizzare un'altra raccolta come messa in scena.

risposta

9

credo, il codice dovrebbe essere più simile a questo (non prova)

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 

Dopo di che, è possibile modificare la embeds_many-has_many e (si spera) dovrebbe funzionare bene.

+0

Grazie, sto per fare un tentativo! –

+0

Fammi sapere se ha funzionato :) –

+0

Sì, funziona! Grazie ancora. –

6

troppo poco rappresentante di commentare, ma penso (altrimenti molto utile) risposta di Sergio può essere superata. Con mongoid 3.0.5 non ho potuto utilizzare

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

ma invece utilizzato

child_coll = Mongoid.default_session[:children]

che ha fatto il trucco per me

0

Per quanto mi riguarda ho bisogno di rimuovere il '_id 'attributo prima di inserire altrimenti otterrò l'errore Chiave duplicata.

Problemi correlati