2016-07-17 1 views
1

私はすべての読み取りクエリを特定のDBに送信し、すべての書き込みクエリを別のDBに送信する必要があるアプリケーションを作成しなければなりません。どちらのデータベースもPostgresです。すべての読み込みクエリに対して2番目のDBに接続する方法は?

私はSecondbaseを見つけましたが、それは有望に見えますが、後のことを達成するための具体的な方法を定義していません。

私は、最も簡単なアプローチはsecondbaseを使用し、必要に応じて接続を切り替えるためにすべてのアクティブなレコード関数にフックを入れることだと考えています。それはハックのように思えるので、わかりません。

もう1つのアプローチは、クラスレベルでセカンドベースのDB接続を定義できるので、私のモデルのすべてをサブタイプ化することです(read_write_)。このアプローチはあまりにも複雑に思えます。

これらのいずれかが他のものより優れていますか?あなたは別の方法でこの行動を達成しましたか?

+0

いくつかのデータベースドライバライブラリが異なるデータベースに読み書きクエリをルーティングできるように、使用しているデータベース(mysql、postgresなど)を指定すると便利です(MySQLコネクタJavaはこれを行うことができます)。 – thewmo

答えて

0

私は、次を介してこれを達成:

各Rails.envため#{Rails.env}_read#{Rails.env}_writedatabase.ymlを作成します。書き込みデータベースを#{Rails.env}と設定して、移行を実行できるようにしました。

def connect_to_read_db 
    DatabaseConnector.connect_to_db('read') 
end 

def connect_to_write_db 
    DatabaseConnector.connect_to_db('write') 
end 

クラスやスワッピングを担当するメソッドを作成します。

は、適切な接続を指し、各コントローラ機能のフックの前に追加します。

class DatabaseConnector 

    class << self 
     def connect_to_db(function) 
      if !(Rails.env.development? || Rails.env.test?) 
      if ActiveRecord::Base.connection_config[:function] != function 
       Rails.logger.debug "Gathering DB details" 
       seed_file = Rails.root.join('config', 'database.yml') 
       loaded_yml_file = YAML::load_file(seed_file) 
       connection_name = "#{Rails.env}_#{function}" 
       Rails.logger.debug "attempting connection to: #{connection_name}" 
       db_details = loaded_yml_file[connection_name] 
       Rails.logger.debug "database details:" 
       db_details.each do |d| 
        Rails.logger.debug(d) 
       end 
       ActiveRecord::Base.establish_connection(
        adapter: db_details['adapter'], 
        port: db_details['port'], 
        pool: db_details['pool'], 
        timeout: db_details['timeout'], 
        encoding: db_details['encoding'], 
        host: db_details['host'], 
        database: db_details['database'], 
        username: db_details['username'], 
        password: db_details['password'] 
       ) 
      end 
      end 
     end 
    end 
end 
関連する問題