Module: DatabaseSlave::Connection

Defined in:
lib/database_slave/connection_handler.rb

Overview

Description

当真正要执行一条SQL语句的时候, Rails会调用

ActiveRecord::Base.connection

方法到连接池中获取一个数据库连接. 以上方法定义在:

activerecord/lib/active_record/connection_adapters/abstract/connection_specification.rb

而ActiveRecord::Base.connection则调用的是:

ActiveRecord::Base.connection_handler.retrieve_connection(klass)

由此可知, 要想获取到的是从库连接而非主库连接, 那么上述方法的klass就需要传入之前建立的从库连接的class名而不是默认的self.

因此, 我们在这里重写了ActiveRecord::Base.connection方法, 在其中增加了在什么时候应该使用从库连接的判断, 并用Module#prepend方法将我们重写后的connection方法加载到ActiveRecord::Base 的前面, 以便我们重写后的connection方法比ActiveRecord::Base.connection方法先执行.

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Class Method Details

.prepended(base) ⇒ Object



63
64
65
66
67
# File 'lib/database_slave/connection_handler.rb', line 63

def self.prepended(base)
  class << base
    prepend ClassMethods
  end
end