代码之家  ›  专栏  ›  技术社区  ›  Mike Trpcic

ActiveRecord和两个数据库通话?

  •  15
  • Mike Trpcic  · 技术社区  · 14 年前

    OldUser.all.each do |ou|
      NewUser.create({
        :first_name   => ou.first_name
        :last_name    => ou.last_name
        :login        => ou.login
        :company_name => ou.company.name
      })
    end
    

    是否有任何项目/库可以帮助我做到这一点?

    3 回复  |  直到 14 年前
        1
  •  20
  •   François Beausoleil    14 年前

    您只需在模型或中指定连接选项数据库.yml. 我们先走第一条路:

    # This is the new users table - connects to development/test/production
    # DB from database.yml
    class User < ActiveRecord::Base
    end
    
    class OldUser < ActiveRecord::Base
      establish_connection :adapter  => "postgresql",
                           :database => "legacy_users",
                           :username => "whatever",
                           :password => "something"
      set_table_name "u_users" # Whatever you require
      belongs_to :company, :class_name => "OldCompany", :foreign_key => "fk_company_id"
    end
    
    class OldCompany < ActiveRecord::Base
      establish_connection :adapter  => "postgresql",
                           :database => "legacy_users",
                           :username => "whatever",
                           :password => "something"
      set_table_name "u_company" # Whatever you require
      has_many :users, :class_name => "OldUser", :foreign_key => "fk_company_id"
    end
    

    在常规代码中,您使用的模型就像您习惯于:

    OldUser.find_each do |ouser|
      User.create!(:username => ouser.username, :company_name => ouser.company.name)
    end
    

    ActiveRecord将为您处理所有细节。

    现在,如果你和我一样,你不喜欢在你的模型里放这样的细节-用户名,密码等等。简单的-把配置移到数据库.yml并使用正确的建立\u连接语法进行连接:

    # database.yml
    development:
      adapter: postgresql
      # go on as usual, for all 3 envs
    
    legacy_users_development:
      adapter:  postgresql
      database: legacy_users
      username: whatever
      password: something
    

    请注意命名约定-遗留用户_#{轨道.env}这就是我的目标,下面是如何做到的:

    class OldUser < ActiveRecord::Base
      establish_connection "legacy_users_#{Rails.env}"
      set_table_name "u_users" # Whatever you require
      belongs_to :company, :class_name => "OldCompany", :foreign_key => "fk_company_id"
    end
    

    答对了,其他一切都会好的。

        2
  •  5
  •   Jed Schneider    14 年前

    更新

    在应用程序中

    models
      |_ legacy
         |_ base.rb
         |_ user.rb
         |_ company.rb
      |_ user.rb
    

    module Legacy
      class Base < ActiveRecord::Base
        self.abstract_class :true
        establish_connection "database here"
      end
    end
    
    module Legacy
      class User < Legacy::Base
        :has_many :companies, :class_name => 'Legacy::Company', :foreign_key => 'user_id'
      end
    end
    
    module Legacy
      class Company < Legacy::Base
        set_table_name 'companies'
        set_primary_key 'someId'
        belongs_to :user, :class_name => 'Legacy::User', :foreign_key => 'operator'
      end
    end
    

    在你需要的地方寻找

    Legacy::User.new
    User.new
    
    Legacy::User.first.companies #=> returns array of Legacy::Companies
    
        3
  •  2
  •   Community leo1    12 年前

    您可以选择:

    • Magic Models 上次更新于2009年(截至2012年11月1日)

    • Connection Ninja 上次更新于2010年(截至2012年11月1日)

    • DB Charmer 上次更新时间约为6个月前(截至2012年11月1日)

    • establish_connection 在模型中连接到所需的数据库

    • Activewarehouse etl—一个相当活跃的gem,用于执行db提取转换加载工作。