2009-07-29 18 views
6

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

回答