web-dev-qa-db-ja.com

Ruby on railsで複数のデータベースに接続する

Ruby on Railsアプリケーションは正常に動作し、データベースに接続されています。同じアプリケーションから別のデータベースに接続したいです。データモデル実際、異なるデータベースに接続する場合、アプリケーションは正常に動作しますが、2つの異なるデータベースに接続したいのです。Ruby on rails?

31
user1428970

複数のデータベース接続の場合、次のコードをdatabase.ymlファイルに追加する必要があります。ここでは、Railsアプリケーションから2つのデータベースを接続する例を示します。

config/database.yml

development:
  adapter: mysql2
  database: db1_dev
  username: root
  password: xyz
  Host: localhost

development_sec:
  adapter: mysql2
  database: db2_dev
  username: root
  password: xyz
  Host: localhost

production:
  adapter: mysql2
  database: db1_prod
  username: root
  password: xyz
  Host: your-production-ip

production_sec:
  adapter: mysql2
  database: db2_prod
  username: root
  password: xyz
  Host: your-production-ip

ここでは、開発環境と実稼働環境に2つのデータベースを使用しました。

次に、モデルをデータベースに接続する必要があります。アプリケーションを開発モードとプロダクションモードで実行している場合、すべてのモデルは、database.ymlで言及されている開発およびプロダクションdbパラメーターを介してマップされます。したがって、一部のモデルでは、他のデータベースに接続する必要があります。

仮定すると、ユーザーとカテゴリの2つのモデルがあります。 usersテーブルはdb1_devとdb1_prodにあり、categoryテーブルはdb2_devとdb2_prodにあります。

カテゴリーモデル

class Category < ActiveRecord::Base
  establish_connection "#{Rails.env}_sec"
end

同様に、2番目のデータベースに新しい移行を追加する場合、次のコードを追加する必要があります。

class CreateRewards < ActiveRecord::Migration
  def connection
    ActiveRecord::Base.establish_connection("#{Rails.env}_sec").connection
  end

  def change
    # your code goes here.
  end
end

それがあなたのために働くことを願っています:)。

73
Bachan Smruty

使用する - establish_connection 別のデータベースに切り替えるには:

ActiveRecord::Base.establish_connection(
  :adapter  => "mysql",
  :Host     => "localhost",
  :username => "myuser",
  :password => "mypass",
  :database => "somedatabase"
)

以下のように、あらかじめ設定された環境をdatabase.ymlから渡すこともできます:

ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['other_env'])

特定のモデルに設定することもできます:

MyClass.establish_connection(...)
18
PinnyM