0

ユーザーが提供するさまざまなデータベース接続を保存し、それぞれに対して任意のSQLを実行するRailsアプリを構築しています。各データベース接続文字列を「接続」モデルのインスタンスとして表しており、理想的には activerecord ORM を使用して、各接続によって表されるデータベースを照会するメソッドを記述できるようにしたいと考えています。ただし、次のコードで Establish_connection メソッドを使用すると、作成したコードは接続テーブル全体のデータベース接続を上書きします。Connections テーブル全体の接続を上書きせずに、コードを変更して任意のデータベースにクエリを実行する方法を教えてください。

class Connection < ActiveRecord::Base
  validates_presence_of :host, :port, :db_name, :db_user, :db_password, :db_type

  def connect
    self.connection = ActiveRecord::Base.establish_connection(
      adapter: self.db_type,
      host: self.host,
      database: self.db_name,
      username: self.db_user,
      password: self.db_password
    )
  end

end
4

1 に答える 1

1

そのための良い方法は、必要なデータベース接続ごとにモデルを作成し、それらのサブクラスとして他のモデルを作成することです。たとえば、次のようになります。

  1. database.yml で必要なすべての接続を定義します (環境ごと)
    # DB 1
    development:
      adapter: mysql2
      encoding: utf8
      database: db_1
      username: ****
      password: ****
      host: ********
      pool: 5
      ...

    # DB 2
    db2_development:
      adapter: mysql2
      encoding: utf8
      database: db_2
      username: ****
      password: ****
      host: ********
      pool: 5
      ...

    # Same for production (and/or other environments)
    production:
      ...
    db2_production:
      ...
  1. から継承する各データベースの「マスター」モデルを定義します。ActiveRecord::Base
    # DB1
    class DB1 < ActiveRecord::Base
      self.abstract_class = true
    end

    # DB2
    class DB2 < ActiveRecord::Base
      self.abstract_class = true
      establish_connection "db2_#{Rails.env}"
    end

    ...
  1. 次に、すべてのデータベース固有のモデルを、上で定義したモデルのサブクラスとして次のように定義します。
    # DB1 specific model
    class DB1_model < DB1
      # model logic here
    end

    # DB2 specific model
    class DB2_model < DB2
       # model logic here
    end

    ...

そして、あなたは行ってもいいです。

このようにして、異なる環境 (通常はdevelopmentstagingpreprodおよびproductionですが、場合によっては異なる場合があります) にある N 個のデータベースに接続できます。

また、Rails は各データベースの SQL 接続のプールを管理することを思い出してください。

上記の例では、Rails はデータベースごとに最大5 つの接続を開くため、合計は10になります(アプリケーションの単一インスタンスの場合)。Phusion Passenger または Unicorn を使用し、8 つのアプリケーション インスタンスを生成する場合、合計 SQL 接続は (最大で) 10*8 = 80 になります。

于 2013-07-14T08:26:14.430 に答える