2009-07-29 12 views
6

Oto moja sytuacja: Mam 2 obiekty osoby, person1 i person2, które zostały utworzone z dwóch różnych zewnętrznych źródeł danych. Mam ręczny proces, z którego korzystam, który stwierdził, że osoba 1 i osoba2 rzeczywiście odnoszą się do tej samej osoby, więc chcę je "scalić" w jedną osobę i usunąć duplikat.Jak najlepiej "scalić" dwa obiekty i ich powiązania w szynach?

Nie mam problemu z robieniem tego na podstawie pola dla samego obiektu, ale rzecz, która staje się trudna i będzie trudna do utrzymania, jeśli robię to źle, jest to, że ci ludzie mają skojarzenia (nie my wszyscy). To, co chcę zrobić, to po skopiowaniu odpowiednich pól do osoby 1 (której używam w przyszłości), chcę przenieść powiązania również z osoby2 na osobę1.

Myślę, że moje pytanie sprowadza się do tego: Czy istnieje sposób na 1) iterowanie po każdym powiązaniu dla obiektu i 2) określenie pola foreign_key dla tego powiązania. Jestem prawie pewien, że gdybym był w stanie to zrobić, mógłbym napisać metodę, która automatycznie przenosiłaby każdy powiązany rekord z person2 na person1, i nie zmieniał tego kodu, jeśli dodaję lub usuwam powiązanie.

Wszelkie pomysły, jak to zrobić?

Dzięki.

Edycja: Zaimplementowałem (tak szybko i niechlujnie, jak to tylko możliwe) kod oparty na wskaźnikach podanych w odpowiedzi Duncana. Na wypadek, gdyby to pomogło komukolwiek, jest to ogólny zarys tego, jak można przenieść wszystkie powiązane obiekty z jednego obiektu (@ p2 w tym przypadku) do innego (@ 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 

Odpowiedz