class ActiveRecord::ShardFor::ClusterConfig

Attributes

connection_registry[R]
name[R]

Public Class Methods

new(name) click to toggle source

@param [Symbol] name

# File lib/activerecord/shard_for/cluster_config.rb, line 7
def initialize(name)
  @name = name
  @connection_registry = {}
end

Public Instance Methods

connections() click to toggle source

@return [Array<Symbol>] An array of connection name

# File lib/activerecord/shard_for/cluster_config.rb, line 23
def connections
  connection_registry.values
end
fetch(key) click to toggle source

@param [Object] key @return [Symbol] registered connection name @raise [KeyError] when key is not registered

# File lib/activerecord/shard_for/cluster_config.rb, line 30
def fetch(key)
  connection_registry.each do |connection_key, connection|
    case connection_key
    when Range then return connection if connection_key.include?(key)
    else return connection if connection_key == key
    end
  end

  raise KeyError.new, "#{key} is not registerd connection"
end
register(key, connection_name) click to toggle source

@param [Object] key sharding key object for connection @param [Symbol] connection_name @raise [RuntimeError] when duplicate entry of key

# File lib/activerecord/shard_for/cluster_config.rb, line 15
def register(key, connection_name)
  raise RuntimeError.new, "#{key} is registered" if connection_registry.key?(key)

  establish_connection(connection_name)
  connection_registry[key] = connection_name
end

Private Instance Methods

establish_connection(connection_name) click to toggle source

Establish connection for shard. @param [Symbol] connection_name

# File lib/activerecord/shard_for/cluster_config.rb, line 51
      def establish_connection(connection_name)
        shard_name = generate_shard_name(connection_name)

        model = shard_name.safe_constantize

        return if model

        model = Class.new(ActiveRecord::Base) do
          self.abstract_class = true

          module_eval <<-RUBY, __FILE__, __LINE__ + 1
            def self.name
              "#{shard_name}"
            end
          RUBY
        end

        Object.const_set(shard_name, model)

        model.establish_connection connection_name
      end
generate_shard_name(connection_name) click to toggle source

@param [Symbol] connection_name @return [String]

# File lib/activerecord/shard_for/cluster_config.rb, line 45
def generate_shard_name(connection_name)
  "ShardFor#{connection_name.to_s.tr('-', '_').classify}"
end