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