class MixedGauge::ShardRepository
Manages generated AR models
Attributes
assigned_slots[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/mixed_gauge/shard_repository.rb, line 8 def initialize(cluster_config, base_class) @base_class = base_class shards = cluster_config.connection_registry.map do |slot_range, connection_name| [connection_name, generate_model_for_shard(connection_name, slot_range)] end @shards = Hash[shards] end
Public Instance Methods
all()
click to toggle source
@return [Array<Class>]
# File lib/mixed_gauge/shard_repository.rb, line 30 def all @shards.values end
fetch(connection_name)
click to toggle source
@param [Symbol] connection_name @return [Class] A model class for this shard
# File lib/mixed_gauge/shard_repository.rb, line 19 def fetch(connection_name) @shards.fetch(connection_name) end
fetch_by_slots(assigned_slots)
click to toggle source
@param [Range] slots @return [Class, nil] A AR model class.
# File lib/mixed_gauge/shard_repository.rb, line 25 def fetch_by_slots(assigned_slots) @shards.find { |_, model| model.assigned_slots == assigned_slots }[1] end
Private Instance Methods
generate_class_name(connection_name)
click to toggle source
@param [Symbol] connection_name @return [String]
# File lib/mixed_gauge/shard_repository.rb, line 63 def generate_class_name(connection_name) "ShardFor#{connection_name.to_s.tr('-', '_').classify}" end
generate_model_for_shard(connection_name, slot_range)
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/mixed_gauge/shard_repository.rb, line 40 def generate_model_for_shard(connection_name, slot_range) base_class_name = @base_class.name class_name = generate_class_name(connection_name) model = Class.new(base_class) do class << self attr_reader :assigned_slots end @assigned_slots = slot_range self.table_name = base_class.table_name module_eval <<-RUBY, __FILE__, __LINE__ + 1 def self.name "#{base_class_name}::#{class_name}" end RUBY end model.class_eval { establish_connection(connection_name) } model end