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