2

レーキ タスクを使用して、スキーマがわずかに異なるデータベース間でデータを移動しています。

機種名が異なっていても問題ありません。たとえば、「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

ただし、モデル名が同一の 2 つのデータベース間でコピーする場合、外部データベースのクラスを定義すると現在のアプリケーションのクラスがオーバーライドされるため、これは機能しません。何か案は?

4

2 に答える 2

3

任意のモデルのテーブル名をオーバーライドできます。

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

モデルにテーブルの名前を付けたい場合は、それらをいくつかのモジュールでスコープできます。

また、トランザクション内で複数の db-query がより高速に実行されることも忘れないでください。

また、別のセクションの下に 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 に答える