2012-03-16 16 views
7

Necesito convertir un documento incrustado en su propia colección, por lo que se puede hacer referencia a partir de otra colección.Mongoid: convertir documento incrustado en referencia/colección propia

Supongamos que tengo un Parent que incrusta muchos Childs. Estaba pensando en algo en esto:

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 

¿Es esta una opción? Lo ideal sería que ejecutara esto en una consola y solo cambiaría las asignaciones de mongoid de embed_* a has_*, así que no necesitaría cambiar el resto de mi código ni usar otra colección como montaje.

Respuesta

9

creo, el código debe ser de la misma familia (no probar)

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 

Después de eso, usted puede cambiar su embeds_many-has_many y (con suerte) que debería funcionar bien.

+0

¡Gracias, voy a intentarlo! –

+0

Avísame si funcionó :) –

+0

¡Sí, funciona! Gracias de nuevo. –

6

muy poco representante para comentar, pero creo que la respuesta de Sergio (de lo contrario, muy útil) puede estar desactualizada. Con MongoId 3.0.5 que no podía usar

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

pero en cambio se utiliza

child_coll = Mongoid.default_session[:children]

la que hizo el truco para mí

0

Para mí tengo que quitar el '_id 'atributo antes de insertar, de lo contrario obtendré un error clave duplicado.

Cuestiones relacionadas