这是我的情况: 我有两个人对象,person1和person2,它们是从两个不同的外部数据源创建的。我有一个手动过程,我使用它确定person1和person2实际上是指同一个人,所以我想要做的是将它们“合并”到一个人,并删除副本。
对于对象本身而言,在逐个字段的基础上执行此操作没有任何问题,但是如果我做得很糟糕,那些变得棘手且难以维护的事情是这些人有关联(不是我们所有)。我想要做的是将相应的字段复制到person1(我将继续使用),我想将关联从person2移动到person1。
我认为我的问题归结为:有没有办法1)迭代对象的每个关联,2)确定该关联的foreign_key字段。我很确定如果我能够做那些事情,我可以编写一个方法,自动将每个相关记录从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
答案 0 :(得分:3)
以编程方式检查ActiveRecord对象的关联,您将要使用ActiveRecord::Reflection
。这里定义的类方法返回由ActiveRecord::Reflection::AssociationReflection
组成的集合,您可以从中提取外键,主键,表名等...