我正在使用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
但是,在具有相同模型名称的两个数据库之间进行复制时,这不起作用,因为定义外部数据库的类会覆盖当前应用程序中的类。有什么想法吗?
答案 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来来回移动数据,如果它比试图找到解决名称冲突的方法要少一些。