2009-07-29 5 views
6

ここに私の状況です: 2つの異なる外部データソースから作成されたperson1とperson2という2つのpersonオブジェクトがあります。 person1とperson2が実際に同じ人物を参照していると判断した手作業のプロセスがあるので、私がしたいのはそれらを1人の人に「マージ」してその複製を削除することです。2つのオブジェクトとそれらの関連をレールに「マージする」最良の方法は?

私はフィールドベースでオブジェクト自体のためにこれを行うことに問題はありませんが、面倒なことをすると難しくなり、維持が難しいことは、これらの人々には関連があります私たちすべて)。私がしたいのは、適切なフィールドをperson1にコピーした後です(私はこれから使用します)。私はperson2からperson1にも関連を移したいと思っています。

私は自分の質問にこだわると思う:1)オブジェクトの各関連付けを反復し、2)その関連付けのためのforeign_keyフィールドを決定する方法があるか?私はこれらのことをすることができれば、関連付けられたレコードをperson2からperson1に自動的に移動するメソッドを書くことができ、関連付けを追加または削除するとコードを変更しないと確信しています。

これを行う方法に関するアイデアはありますか?

ありがとうございました。

編集: 私はDuncanの答えで与えられたポインタに基づいてコードを実装しました(できるだけ早く、大雑把に動作するようです)。これは誰にも役立ちます。これは、関連オブジェクトをすべて1つのオブジェクト(この場合は@ p2)から別のオブジェクト(@ p1)に移動する方法の概略です。プログラム的にあなたがActiveRecord::Reflectionを使用したいと思うのActiveRecordオブジェクトの関連付けを検査する

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 

答えて

関連する問題