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

标签 ruby-on-rails postgresql activerecord rake

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

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

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

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

最佳答案

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

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

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

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

您还可以将数据库连接参数放在不同部分下的 database.yml 中,并通过将其名称传递给 assessment_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

关于ruby-on-rails - Rake 任务在具有相同模型名称的数据库之间复制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12537211/

相关文章:

ruby-on-rails - 为什么我在使用 `acts_as_taggable_on` 时会收到这个简单的错误?

javascript - Bootstrap 可折叠面板未打开 - 控制台中没有错误

sql - 第二次执行时查询挂起

ruby-on-rails - 在 Rspec 中使用 Factory Girl

javascript - 表单多次提交

perl - postgresql 连接并关闭自动提交

python - ZeroMQ 对于数据库事务来说太快了

ruby-on-rails - rails : ActiveRecord query based on association value

ruby - Ruby Sinatra ActiveRecord 中的基本搜索

mysql - Rails 事件记录带有条件排序。 mysql