Sha256: 085b4492eb0b0bbbb411f8d8ebbe462b9a721946ebda60b93378a7c491e080bd

Contents?: true

Size: 1.11 KB

Versions: 4

Compression:

Stored size: 1.11 KB

Contents

class Octopus::ScopeProxy
  attr_accessor :shard, :klass

  def initialize(shard, klass)
    @shard = shard
    @klass = klass
  end

  def using(shard)
    raise "Nonexistent Shard Name: #{shard}" if @klass.connection.instance_variable_get(:@shards)[shard].nil?
    @shard = shard
    return self
  end

  # Transaction Method send all queries to a specified shard.
  def transaction(options = {}, &block)
    @klass.connection.run_queries_on_shard(@shard) do
      @klass = @klass.connection().transaction(options, &block)
    end
  end

  def connection
    @klass.connection().current_shard = @shard
    @klass.connection()
  end

  def method_missing(method, *args, &block)
    result = @klass.connection.run_queries_on_shard(@shard) do
      @klass.send(method, *args, &block)
    end

    if result.respond_to?(:scoped)
      @klass = result
      return self
    end

    result
  end

  # Delegates to method_missing (instead of @klass) so that User.using(:blah).where(:name => "Mike")
  # gets run in the correct shard context when #== is evaluated.
  def ==(*args)
    method_missing(:==, *args)
  end
  alias :eql? :==
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
ar-octopus-0.7.0 lib/octopus/scope_proxy.rb
ar-octopus-0.6.1 lib/octopus/scope_proxy.rb
ar-octopus-0.6.0 lib/octopus/scope_proxy.rb
ar-octopus-0.5.0 lib/octopus/scope_proxy.rb