2009-07-29 9 views
6

Aquí está mi situación: Tengo objetos de 2 personas, persona1 y persona2, que se crearon a partir de dos fuentes de datos externas diferentes. Tengo un proceso manual que utilizo que ha determinado que person1 y person2 realmente se refieren a la misma persona, por lo que lo que quiero hacer es "fusionarlos" en una sola persona y eliminar el duplicado.¿Cuál es la mejor manera de "fusionar" dos objetos y sus asociaciones en rieles?

No tengo ningún problema haciendo esto campo por campo para el objeto en sí, pero lo que se pone complicado, y será difícil de mantener si lo hago mal, es que estas personas tienen asociaciones (no todos). Lo que quiero hacer es después de copiar los campos apropiados en person1 (que usaré de ahora en adelante), también quiero mover las asociaciones de person2 a person1.

Creo que mi pregunta se reduce a esto: ¿Hay alguna manera de 1) iterar sobre cada asociación para un objeto, y 2) determinar el campo foreign_key para esa asociación. Estoy bastante seguro de que si pudiera hacer esas cosas, podría escribir un método que moviera automáticamente cada registro asociado de persona2 a persona1, y no cambiar ese código si agrego o elimino una asociación.

¿Alguna idea sobre cómo hacer esto?

Gracias.

Edité: He implementado (lo más rápido y sucio posible mientras parece funcionar) el código basado en los punteros dados en la respuesta de Duncan. En caso de que esto ayude a alguien, este es un bosquejo aproximado de cómo podría mover todos los objetos asociados de un objeto (@ p2 en este caso) a otro (@ p1).

Person.reflect_on_all_associations.each do |assoc| 
    if assoc.macro == :has_many 
    @p2.send(assoc.name).each do |assoc_obj| 
     assoc_obj.update_attribute(assoc.primary_key_name, @p1.id) 
    end 
    elsif assoc.macro == :has_one 
    @p2.send(assoc.name).update_attribute(assoc.primary_key_name, @p1.id) 
    end 
end 

Respuesta

Cuestiones relacionadas