2009-07-29 7 views
6

Ecco la mia situazione: Ho 2 oggetti persona, persona1 e persona2, che sono stati creati da due diverse origini dati esterne. Ho un processo manuale che utilizzo che ha determinato che persona1 e persona2 si riferiscono effettivamente alla stessa persona, quindi ciò che voglio fare è "unirli" a una singola persona e rimuovere il duplicato.Come meglio "unire" due oggetti e le loro associazioni nelle rotaie?

Non ho alcun problema a fare questo campo per campo per l'oggetto stesso, ma la cosa che diventa complicata, e sarà difficile da mantenere se lo faccio male, è che queste persone hanno associazioni (non noi tutti). Quello che voglio fare è dopo aver copiato i campi appropriati in person1 (che userò andando avanti), voglio spostare anche le associazioni da person2 a person1.

Penso che la mia domanda si riduce a questo: esiste un modo per 1) iterare su ciascuna associazione per un oggetto e 2) determinare il campo foreign_key per quell'associazione. Sono abbastanza sicuro che se potessi fare quelle cose potrei scrivere un metodo che sposta automaticamente ogni record associato da person2 a person1, e non cambiare quel codice se aggiungo o rimuovo un'associazione.

Qualche idea su come fare questo?

Grazie.

Modifica: Ho implementato (il più rapidamente e il più impercettibilmente possibile mentre sembra funzionare) il codice basato sui puntatori dati nella risposta di Duncan. Nel caso in cui questo aiuti qualcuno, questo è un abbozzo di come è possibile spostare tutti gli oggetti associati da un oggetto (@ p2 in questo caso) a un altro (@ 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 

risposta

Problemi correlati