在rails中访问只读数据库的最佳方法

时间:2017-02-17 15:47:20

标签: ruby-on-rails heroku activerecord master-slave

我们的应用程序部署在Heroku上,使用Unicorn和主从数据库配置,所有应用程序请求(读取和写入)都将发送到主数据库。

我们需要的是将一些read流量重定向到关注者(从属)数据库。

为实现这一目标,我们添加了read_only_database_connection.rb -

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

并添加了mixin 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流量重定向到只读数据库?

1 个答案:

答案 0 :(得分:3)

我认为继承自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

这里是readonly?方法的documentation