Sha256: 502b461aa4b858dd9d14bae41a45db40b650856817b9895283b5c5880bc1abb3

Contents?: true

Size: 1.18 KB

Versions: 2

Compression:

Stored size: 1.18 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

  def as_json(options = nil)
    method_missing(:as_json, options)
  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

2 entries across 2 versions & 1 rubygems

Version Path
ar-octopus-0.8.1 lib/octopus/scope_proxy.rb
ar-octopus-0.8.0 lib/octopus/scope_proxy.rb