这是我的情况:
我有 2 个人员对象,人员 1 和人员 2,它们是从两个不同的外部数据源创建的。我使用的手动流程已确定 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
要以编程方式检查 ActiveRecord 对象的关联,您需要使用ActiveRecord::Reflection http://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html
。此处定义的类方法返回包含以下内容的集合ActiveRecord::Reflection::AssociationReflection http://caboo.se/doc/classes/ActiveRecord/Reflection/AssociationReflection.html
您可以从中提取外键、主键、表名等...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)