代码之家  ›  专栏  ›  技术社区  ›  Brad

如何最好地“合并”rails中的两个对象及其关联?

  •  6
  • Brad  · 技术社区  · 17 年前

    我的情况如下: 我有两个person对象,person1和person2,它们是从两个不同的外部数据源创建的。我有一个手动过程,我使用它来确定person1和person2实际上指的是同一个人,所以我想做的是将他们“合并”成一个人,并删除重复的部分。

    对于对象本身,在逐场的基础上这样做是没有问题的,但是如果我做得不好,那么很难维护的是,这些人有关联(我们不是都有)。我想做的是在将适当的字段复制到person1(我将继续使用)之后,我还想将关联从person2移动到person1。

    我想我的问题可以归结为:有没有办法1)迭代对象的每个关联,2)确定该关联的外键字段。我很确定,如果我能够做到这些,我可以编写一个方法,自动将每个关联记录从person2移动到person1,并且在添加或删除关联时不会更改代码。

    有什么办法吗?

    谢谢。

    我已经根据Duncan的答案中给出的指针实现了(尽可能快、尽可能脏,尽管它似乎可以工作)代码。为了以防万一,这对任何人都有帮助,这是如何将所有关联对象从一个对象(@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 回复  |  直到 17 年前
        1
  •  3
  •   Duncan Beevers    17 年前

    以编程方式检查要使用的ActiveRecord对象的关联 ActiveRecord::Reflection . 这里定义的类方法返回由 ActiveRecord::Reflection::AssociationReflection