class SlavePools::Pools

Public Class Methods

new() click to toggle source
Calls superclass method
# File lib/slave_pools/pools.rb, line 7
def initialize
  pools = {}
  pool_configurations.group_by{|_, name, _| name }.each do |name, set|
    pools[name.to_sym] = SlavePools::Pool.new(
      name,
      set.map{ |conn_name, _, replica_name|
        connection_class(name, replica_name, conn_name)
      }
    )
  end

  if pools.empty?
    SlavePools.log :info, "No pools found for #{SlavePools.config.environment}. Loading a default pool with master instead."
    pools[:default] = SlavePools::Pool.new('default', [ActiveRecord::Base])
  end

  super pools
end

Private Instance Methods

connection_class(pool_name, replica_name, connection_name) click to toggle source

generates a unique ActiveRecord::Base subclass for a single replica

# File lib/slave_pools/pools.rb, line 37
def connection_class(pool_name, replica_name, connection_name)
  class_name = "#{pool_name.camelize}#{replica_name.camelize}"

  SlavePools.module_eval %Q{
    class #{class_name} < ActiveRecord::Base
      self.abstract_class = true
      establish_connection :#{connection_name}
      def self.connection_config
        configurations[#{connection_name.to_s.inspect}]
      end
    end
  }, __FILE__, __LINE__
  SlavePools.const_get(class_name)
end
pool_configurations() click to toggle source

finds valid pool configs

# File lib/slave_pools/pools.rb, line 29
def pool_configurations
  ActiveRecord::Base.configurations.map do |name, config|
    next unless name.to_s =~ /#{SlavePools.config.environment}_pool_(.*)_name_(.*)/
    [name, $1, $2]
  end.compact
end