这是我的情况:我有 2 个人员对象,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