Sha256: a1adf496c73f257c4ff5f51d8eb78359ff2f0eaaf5fbe115a41e401920ba2346
Contents?: true
Size: 1.89 KB
Versions: 2
Compression:
Stored size: 1.89 KB
Contents
module ActiveRecord module ShardFor class ShardRepository < AbstractShardRepository attr_reader :base_class # @param [ClusterConfig] cluster_config # @param [Class] base_class A AR Model def initialize(cluster_config, base_class) @base_class = base_class @shards = cluster_config.connection_registry.each_with_object({}) do |(key, connection_name), hash| establish_connection(connection_name) 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 # Establish connection for shard. # @param [Symbol] connection_name def establish_connection(connection_name) shard_name = generate_shard_name(connection_name) model = Class.new(base_class) do self.table_name = base_class.table_name module_eval <<-RUBY, __FILE__, __LINE__ + 1 def self.name "#{shard_name}" end RUBY end model.establish_connection connection_name end # @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. 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 end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
activerecord-shard_for-0.6.1 | lib/activerecord/shard_for/shard_repository.rb |
activerecord-shard_for-0.6.0 | lib/activerecord/shard_for/shard_repository.rb |