2012-12-26 11 views
5

2つのプロファイルを1つにマージしたい。これをRailsで行う最良の方法は何ですか?2/3レコードをレールにマージする

user1user2という2つのプロファイルがあり、少なくとも30個のテーブルが関連付けられています。

は今、私はそこつのプロファイルもuser1を言うとuser2を削除したが、取得する必要がある必要がありますようにそれらを一緒にマージしたいuser2すべての関連データ今すべきuser1関連付けます。

例:user1に連絡先が2つある場合はuser1に3つの連絡先があり、連絡先がuser1の場合は5つの連絡先が必要です。

答えて

6

テストちょっと乱雑ではなく

User < ActiveRecord::Base 
    has_many ... 

    acts_as_user_merge 

end 

@user1.merge(@user2) 

を使用する方法

module UserMerge 
    module ActsAsUserMerge 
    module Base 
     def self.included(klass) 
     klass.class_eval do 
      extend Config 
     end 
     end 
    end 

    module Config 
     def acts_as_user_merge 
      include ::UserMerge::ActsAsUserMerge::InstanceMethods 
     end 
    end 

    module InstanceMethods  
     def merge(user) 
     models = Array.new 
     models_names = User.reflections.collect{|a, b| b.class_name if b.macro==:has_many}.compact 
     models_names.each do |name| 
      models << Object.const_get name 
     end 
     models.each do |model| 
      model.where("user_id = ?", user.id).update_all(:user_id => self.id) 
     end 
     user.destroy 
     end 
    end 
    end 
end 

::ActiveRecord::Base.send :include, ::UserMerge::ActsAsUserMerge::Base 

/lib/acts_as_user_merge.rb一般化ソリューション 場所ファイルの場合、この

@user1 = User.find(1); 
@user2 = User.find(2); 

Contact.where("user_id = ?", @user2.id).update_all(:user_id => @user1.id) 
@user2.destroy 

ような何かあなたに考えを与える必要があります

+0

私はいくつかの一般化ソリューションをしたい....私はそれを行うにはしたくありません私の30のすべての団体 – Salil

0

その

def merge_users(dead, user) 
    User.reflections.each do |assoc, reflection| 
    foreign_key = reflection.foreign_key 
    case reflection.macro 
    when :has_many, :has_one then 
     unless reflection.options[:through] 
     reflection.klass.where(foreign_key => dead.id).update_all(foreign_key => user.id) # if id is a primary key 
     end 
     if options[:as] # polymorphic 
     if reflection.macro == :has_many 
      dead.send("#{options[:as].pluralize}")).each { |r| user.send("#{options[:as].pluralize}<<", r) } 
     else 
      user.send("#{options[:as]}=", dead.send("#{options[:as]}")) 
      user.save 
     end 
     end 
    when :belongs_to then 
     if options[:polymorphic] 
     user.send("#{assoc}=", deaf.send(assoc)) 
     user.save 
     else 
     user.update_attribute(foreign_key, dead.send(foreign_key)) 
     end 
    when :has_and_belongs_to_many then 
     dead.send("#{assoc}")).each { |r| user.send("#{assoc}<<", r) } 
    end 

    end 
end 

merge_users(dead_user, user) 
dead_user.destroy 
関連する問題