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