2017-02-17 8 views
0

私たちのアプリは、すべてのアプリリクエスト(読み書き)がマスターDBに向かうUnicornとマスタースレーブのデータベース設定でHerokuにデプロイされます。レールで読み取り専用データベースにアクセスする最も良い方法

私たちが必要とするのは、readトラフィックの一部をフォロワー(スレーブ)データベースにリダイレクトすることです。

は、これを達成するために、我々はread_only_database_connection.rb追加 -

class ReadOnlyDatabaseConnection < ActiveRecord::Base 
    self.abstract_class = true 
end 

をしてミックスインを追加switch_connection.rb

module SwitchConnection 
    def readonly_db_connection  
    current_conf = ReadOnlyDatabaseConnection.connection_config 
    begin 
     ReadOnlyDatabaseConnection.establish_connection(READONLY_CONFIG).tap do 
     puts "Primary DB -> Follower DB" 
     end 

     yield 
    ensure 
     ReadOnlyDatabaseConnection.establish_connection(current_conf).tap do 
     puts "Follower DB -> Primary DB" 
     end 
    end 
    end 
end 

そしてapplication_controller.rbに、私がやった -

include SwitchConnection 
around_filter :readonly_db_connection, only: [:index, :show] 

は、これは正しいですこれを行う方法? showindexのすべてのトラフィックをreadonlyデータベースにリダイレクトするためのより良いまたはより安全なアプローチはありますか?

+0

これをチェックしてください:https://github.com/thiagopradi/octopus –

答えて

0

ActiveRecord::Baseから継承したオブジェクトは、データベースを処理する責任があると思います。読み取り専用スレーブデータベースをチェックするモデルを持つことができます。あなたは(私はあなたが疑われる)同じテーブル名を使用する場合は

class ReadOnlyModel < ActiveRecord::Base 
    establish_connection 'readonly_db' 

    def readonly? 
    true 
    end 
end 

class Controller 
    def index 
    @models = ReadOnlyModel.all 
    end 
end 

# in config/database.yml 
readonly_database: 
    adapter: #... 

することは、あなたはtable_nameメソッドを使用することができます。

class Model < ActiveRecord::Base 
end 

class ReadOnlyModel < ActiveRecord::Base 
    self.table_name :models 
end 

ここdocumentationreadonly?方法のためです。

+0

返信いただきありがとうございます。私は100以上のモデルを持っており、それらを読み込み専用モデルとして複製したくないです。 – varunvlalan

関連する問題