class ActiveRecord::ShardFor::ShardRepository

Attributes

assigned_key[R]
base_class[R]

Public Class Methods

new(cluster_config, base_class) click to toggle source

@param [ClusterConfig] cluster_config @param [Class] base_class A AR Model

# File lib/activerecord/shard_for/shard_repository.rb, line 8
def initialize(cluster_config, base_class)
  @base_class = base_class

  @shards = cluster_config.connection_registry.each_with_object({}) do |(key, connection_name), hash|
    model = generate_model_for_shard(connection_name, key)
    base_class.const_set(:"#{generate_shard_name(connection_name)}", model)
    hash[connection_name] = model
  end
end

Private Instance Methods

generate_model_for_shard(connection_name, key) click to toggle source

@param [Symbol] connection_name @param [Range] slot_range @return [Class] A sub class of given AR model.

A sub class has connection setting for specific shard.
# File lib/activerecord/shard_for/shard_repository.rb, line 24
      def generate_model_for_shard(connection_name, key)
        shard_name = generate_shard_name(connection_name)

        Class.new(base_class) do
          self.table_name = base_class.table_name
          class << self
            attr_reader :assigned_key
          end
          @assigned_key = key

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