Rake任务在具有相同模型名称的数据库之间复制数据

时间:2012-09-21 19:45:17

标签: ruby-on-rails postgresql activerecord rake

我正在使用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

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

2 个答案:

答案 0 :(得分:2)

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

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

如果您仍然希望模型以其表格命名,则可以将它们放在某个模块中。

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

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

establish_connection

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

class SomeModel < ActiveRecord::Base
   establish_connection :name_of_my_db_in_yml

答案 1 :(得分:0)

你可以使用ActvieRecord的connection来运行原始SQL来来回移动数据,如果它比试图找到解决名称冲突的方法要少一些。