web-dev-qa-db-ja.com

Railsアクティブなレコードで2つの異なるデータベースを使用するにはどうすればよいですか?

別のRailsモデルで別のデータベース接続を使用する必要があります。それを行うのにそれほどハッキーではない方法はありますか?

リンクや検索キーワードはすばらしいです:)

43
gustavgans

mikejは正しいです。ただし、モデルコードを少しすっきりと接続するgemを作成しました チェックアウト

10
nitecoder

新しいセクションをdatabase.ymlに追加します。

other_development:
  adapter: mysql
  database: otherdb_development
  username: root
  password:
  Host: localhost

other_production:
  adapter: mysql
  database: otherdb_production
  username: root
  password:
  Host: localhost

lib/other_database.rbにクラスを追加

class OtherDatabase < ActiveRecord::Base
  establish_connection "other_#{Rails_ENV}"
end

次に、OtherDatabaseのデフォルトのデータベースサブクラスにない各モデルについて、例:

class MyModel < OtherDatabase
   # my model code...
end
115
mikej

同じアプリで2 dbに接続するために以下を使用しています。そこにあるものがすべてロードされているので、私はそれらをlibフォルダーに入れました。

require 'active_record'

class OldDatabase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection(
  :adapter  => 'mysql',
  :database => 'weather',
  :Host     => 'localhost',
  :username => 'root',
  :password => 'password'
  )
end

class NewDatabase < ActiveRecord::Base
  self.abstract_class = true
  establish_connection(
  :adapter  => 'mysql',
  :database => 'redmine',
  :Host     => 'localhost',
  :username => 'root',
  :password => 'password'
  )
end

class WeatherData < OldDatabase
end

class Board < NewDatabase
end

それが役に立てば幸い

13
penger

Rails 3.xの更新:

class MyModel < ActiveRecord::Base
  establish_connection "other_#{Rails.env}"
end
9
penkovsky

Rails 6は複数のデータベースのネイティブサポートを追加しました: https://edgeguides.rubyonrails.org/active_record_multiple_databases.html

database.yml

development:
  one:
    <<: *default
  other:
    <<: *default

モデルの基本クラス:

class OneModelBase < ActiveRecord::Base
  around_action :set_db

  private

  def set_db
    ActiveRecord::Base.connected_to(database: :one) do
      yield
    end
  end
end

class OtherModelBase < ActiveRecord::Base
  around_action :set_db

  private

  def set_db
    ActiveRecord::Base.connected_to(database: :other) do
      yield
    end
  end
end

また、DBごとに異なる移行とスキーマがあります。 Rails db:createのようなコマンドを実行すると、すべてのデータベースが作成されます。コマンドのスコープを設定できます。 Rails db:create:other

1
thisismydesign

アクティブなモデルを持つ別のデータベースに接続するための最も美しい方法は、外部データベースの基本クラスを作成し、モデルのその基本から継承することだと思います。この方法は、Rails 4.2.6および5.0.4

例えば:

# in /models/external_db/base.rb
require 'active_record'

class ExternalDb::Base < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "external_db_#{Rails.env}".to_sym
end

そしてあなたのモデルクラスで:

# in /models/external_db/some_model.rb
class ExternalDB::SomeModel < ExternalDb::Base
  # your code
end

ただし、/ config/database.ymlで外部データベースを定義する必要があります

# in /config/database.yml
external_db_development:
  adapter: sqlite3
  pool: 5
  timeout: 5000
  database: db/external_db_development.db

external_db_production:
  adapter: sqlite3
  pool: 5
  timeout: 5000
  database: db/external_db_production.db
1
Adi

Rails 4.1+ establish_connectionがシンボルを取ります:

class OtherDbModel < ActiveRecord::Base
  establish_connection :"other_#{Rails.env}"
end
0
Vasfed