Sha256: 4b8ab186e2e95ae63a7967582f65614c6d620cb5dd0b56acc3455374d163dd4b

Contents?: true

Size: 1.85 KB

Versions: 2

Compression:

Stored size: 1.85 KB

Contents

require 'ripple/associations/proxy'
require 'ripple/associations/many'

require 'set'

module Ripple
  module Associations
    class ManyReferenceProxy < Proxy
      include Many

      def <<(value)
        @reflection.verify_type!([value], @owner)

        assign_key(value)
        load_target
        @target << value

        self
      end

      def replace(value)
        @reflection.verify_type!(value, @owner)
        delete_all
        Array(value).compact.each do |doc|
          assign_key(doc)
        end
        loaded
        @keys = nil
        @target = Set.new(value)
      end

      def delete_all
        load_target
        @target.each do |e|
          delete(e)
        end
      end

      def delete(value)
        load_target
        assign_key(value, nil)
        @target.delete(value)
      end

      def target
        @target.to_a
      end

      def keys
        @keys ||= Ripple.client.search(klass.bucket_name, "#{key_name}: #{@owner.key}")["response"]["docs"].inject(Set.new) do |set, search_document|
          set << search_document["id"]
        end
      end

      def reset
        @keys = nil
        super
      end

      def include?(document)
        return false unless document.class.respond_to?(:bucket_name)

        return false unless document.class.bucket_name == @reflection.bucket_name
        keys.include?(document.key)
      end

      def count
        if loaded?
          @target.count
        else
          keys.count
        end
      end

      protected
      def find_target
        Set.new(klass.find(keys.to_a))
      end

      def key_name
        "#{@owner.class.name.underscore}_key"
      end

      def assign_key(target, key=@owner.key)
        if target.new_record?
          target.send("#{key_name}=", key)
        else
          target.update_attribute(key_name, key)
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 2 rubygems

Version Path
seomoz-ripple-1.0.0.pre lib/ripple/associations/many_reference_proxy.rb
ripple-1.0.0.beta lib/ripple/associations/many_reference_proxy.rb