Sha256: 5b3c8e5cbaca5add4892cb9d3a8e16e276ea55182667f422d3a8ddf81e7eb8d2

Contents?: true

Size: 1.39 KB

Versions: 3

Compression:

Stored size: 1.39 KB

Contents

module ActiveRecord::Turntable
  class Shard
    module Connections; end
    def self.connection_classes
      Connections.constants.map { |name| Connections.const_get(name) }
    end

    DEFAULT_CONFIG = {
      "connection" => (defined?(Rails) ? Rails.env : "development"),
    }.with_indifferent_access

    attr_reader :name

    def initialize(shard_spec)
      @config = DEFAULT_CONFIG.merge(shard_spec)
      @name = @config[:connection]
      ActiveRecord::Base.turntable_connections[name] = connection_pool
    end

    def connection_pool
      connection_klass.connection_pool
    end

    def connection
      connection_pool.connection.tap do |conn|
        conn.turntable_shard_name ||= name
      end
    end

    private

      def connection_klass
        @connection_klass ||= create_connection_class
      end

      def create_connection_class
        klass = connection_class_instance
        klass.remove_connection
        klass.establish_connection ActiveRecord::Base.connection_pool.spec.config[:shards][name].with_indifferent_access
        klass
      end

      def connection_class_instance
        if Connections.const_defined?(name.classify)
          klass = Connections.const_get(name.classify)
        else
          klass = Class.new(ActiveRecord::Base)
          Connections.const_set(name.classify, klass)
          klass.abstract_class = true
        end
        klass
      end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
activerecord-turntable-3.1.0 lib/active_record/turntable/shard.rb
activerecord-turntable-3.0.1 lib/active_record/turntable/shard.rb
activerecord-turntable-3.0.0 lib/active_record/turntable/shard.rb