2017-02-17 14 views
0

Наше приложение развернуто на Heroku с конфигурацией базы данных Unicorn и master-slave со всеми запросами приложений (чтение и запись), идущими на мастер-БД.Лучший способ доступа к базе данных только для чтения в рельсах

Нам необходимо перенаправить часть базы данных 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] 

Является ли это право способ сделать это? Есть ли лучший или более безопасный подход для перенаправления всех и index трафика на базу данных только для чтения?

+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 

Вот documentation для метода readonly?.

+0

Спасибо за ответ. У меня более 100 моделей, и я бы не хотел реплицировать их как модели readonly. – varunvlalan