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 |