Как лучше всего «слить» два объекта и их ассоциации в рельсы?

Вот моя ситуация: У меня есть 2 объекта person, person1 и person2, которые были созданы из двух разных внешних источников данных. У меня есть ручной процесс, который я использую, который определил, что person1 и person2 на самом деле относятся к одному и тому же человеку, поэтому я хочу «объединить». их в одного человека, и удалите дубликаты.

У меня нет проблем, когда я делаю это на основе поля для самого объекта, но вещь, которая становится сложной, и которую будет сложно поддерживать, если я сделаю это плохо, состоит в том, что у этих людей есть ассоциации (не все мы). То, что я хочу сделать, - после копирования соответствующих полей в person1 (который я буду использовать в дальнейшем), я хочу также перенести ассоциации с person2 на person1.

Я думаю, что мой вопрос сводится к следующему: есть ли способ 1) перебрать каждую ассоциацию для объекта и 2) определить поле foreign_key для этой ассоциации. Я почти уверен, что, если бы я смог сделать эти вещи, я мог бы написать метод, который автоматически перемещал каждую связанную запись с person2 на person1, и не менял этот код, если я добавляю или удаляю связь.

Есть идеи, как это сделать?

Благодарю.

Редактировать: Я реализовал (настолько быстро и грязно, насколько это возможно, пока это работает) код, основанный на указателях, приведенных в ответе Дункана. На всякий случай, если это кому-нибудь поможет, это грубая схема того, как вы могли бы переместить все связанные объекты из одного объекта (в данном случае @ p2) в другой (@ 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

Ответы на вопрос(1)

Ваш ответ на вопрос