Wie lassen sich zwei Objekte und ihre Assoziationen am besten in Schienen zusammenführen?

Hier ist meine Situation: Ich habe 2 Personenobjekte, Person1 und Person2, die aus zwei verschiedenen externen Datenquellen erstellt wurden. Ich verwende einen manuellen Prozess, bei dem festgestellt wurde, dass sich Person1 und Person2 tatsächlich auf dieselbe Person beziehen. Ich möchte sie also zu einer einzelnen Person "zusammenführen" und das Duplikat entfernen.

Ich habe kein Problem damit, dies auf Feldbasis für das Objekt selbst zu tun, aber das Problem, das schwierig wird und schwer beizubehalten ist, wenn ich es schlecht mache, ist, dass diese Leute Assoziationen haben (nicht wir alle). Nachdem ich die entsprechenden Felder in person1 kopiert habe (was ich später verwenden werde), möchte ich die Assoziationen auch von person2 auf person1 verschieben.

Ich denke, meine Frage läuft darauf hinaus: Gibt es eine Möglichkeit, 1) jede Zuordnung für ein Objekt zu durchlaufen und 2) das foreign_key-Feld für diese Zuordnung zu bestimmen. Ich bin mir ziemlich sicher, dass ich, wenn ich in der Lage wäre, diese Dinge zu tun, eine Methode schreiben könnte, die jeden verknüpften Datensatz automatisch von Person2 zu Person1 verschiebt, und diesen Code nicht ändern könnte, wenn ich eine Verknüpfung hinzufüge oder entferne.

Irgendwelche Ideen, wie das geht?

Vielen Dank.

Bearbeiten: Ich habe Code basierend auf den in Duncans Antwort angegebenen Zeigern implementiert (so schnell und schmutzig wie möglich, während es zu funktionieren scheint). Nur für den Fall, dass dies jemandem hilft, ist dies eine grobe Übersicht darüber, wie Sie alle zugeordneten Objekte von einem Objekt (in diesem Fall @ p2) zu einem anderen (@ p1) verschieben können.

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage