module DatabaseSlave::Connection

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方法先执行.

Public Class Methods

prepended(base) click to toggle source
# File lib/database_slave/connection_handler.rb, line 63
def self.prepended(base)
  class << base
    prepend ClassMethods
  end
end