2009-07-29 9 views
6

Hier ist meine Situation: I 2 Person Objekte, person1 und person2, die aus zwei verschiedenen externen Datenquellen erstellt wurden. Ich habe einen manuellen Prozess, den ich verwendet habe, der festgestellt hat, dass sich person1 und person2 tatsächlich auf die gleiche Person beziehen, also was ich tun möchte, ist es, sie zu einer einzigen Person zu verschmelzen und das Duplikat zu entfernen.Wie kann man zwei Objekte und ihre Assoziationen am besten in Schienen "verschmelzen"?

Ich habe kein Problem, dies auf einer Feld für Feld Basis für das Objekt selbst, aber die Sache, die schwierig wird, und wird schwer zu pflegen, wenn ich es schlecht mache, ist, dass diese Leute haben Assoziationen (nicht wir alle). Was ich tun möchte, ist nach dem Kopieren der entsprechenden Felder in Person1 (die ich weiter verwenden werde), ich möchte die Assoziationen von Person2 zu Person1 auch verschieben.

denke ich, meine Frage an das läuft darauf hinaus: Gibt es eine Möglichkeit zu 1) durchlaufen die einzelnen Verbände für ein Objekt, und 2) für die Vereinigung der foreign_key Feld 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 nach person1 verschiebt und diesen Code nicht ändert, wenn ich eine Verknüpfung hinzufüge oder entferne.

Irgendwelche Ideen, wie man das macht?

Danke.

Edit: Ich habe (so schnell und schmutzig wie möglich, während es scheint zu arbeiten) Code basierend auf den Zeigern in Duncan's Antwort gegeben. Nur für den Fall, dass dies jemandem hilft, ist dies ein grober Überblick darüber, wie Sie alle assoziierten Objekte von einem Objekt (in diesem Fall @ p2) in ein anderes (@ 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 

Antwort

Verwandte Themen