2

我正在使用 rake 任务在架构略有不同的数据库之间移动数据。

当型号名称不同时,这没有问题。例如,将具有“制造商”模型的单独数据库中的信息复制到当前应用程序的“公司”模型中:

task :copy_from_old_to_new => :environment do

  require "active_record"

  class Manufacturer < ActiveRecord::Base
  end

  Manufacturer.establish_connection(
    :adapter =>"postgresql",
    :host => "...", 
    :username => "...", 
    :database => "...")

  Manufacturer.find_each do |m|
    Company.new do |c|
      c.name = m.name
      c.location = m.geography
      c.save
    end
  end

  Manufacturer.connection.close

end

但是,当在具有相同模型名称的两个数据库之间进行复制时,这不起作用,因为为外部数据库定义类会覆盖当前应用程序中的类。有任何想法吗?

4

2 回答 2

3

您可以覆盖任何模型的表名:

class SomeModel < ActiveRecord::Base
   self.table_name = 'some_table'

如果您仍然希望您的模型以它们的表命名,您可以将它们限定在某个模块中。

不要忘记多个数据库查询在一个事务中运行得更快。

您也可以将 db-connection 参数放在database.yml不同的部分下,并通过将其名称传递给establish_connection方法来连接它:

class SomeModel < ActiveRecord::Base
   establish_connection :name_of_my_db_in_yml

如果有多个模型,您可以创建一些基类并从中派生模型:

class MyBase < ActiveRecord::Base
  self.abstract_class = true # important! We don't make STI, just some abstraction.
  establish_connection :name_of_my_db_in_yml

class SomeModel < MyBase
  # connection will be established to your :name_of_my_db_in_yml db
于 2012-09-21T20:09:51.887 回答
0

您可以使用 ActvieRecord 的连接来运行原始 SQL 来来回移动数据,如果它比试图找出解决名称冲突的方法要少的话。

于 2012-09-21T19:53:10.050 回答