Class: Parse::CollectionProxy
- Inherits:
- Object
- Object
- Parse::CollectionProxy
- Includes:
- ActiveModel::Dirty, ActiveModel::Model, Enumerable
- Defined in:
- lib/parse/model/associations/collection_proxy.rb
Overview
A CollectionProxy is a special type of array wrapper that notifies a delegate object about changes to the array in order to perform dirty tracking. This is used for all Array properties in Parse::Objects. Subclasses of CollectionProxy are also available for supporting different association types such as an array of Parse pointers and Parse relations.
Direct Known Subclasses
Instance Attribute Summary collapse
- #collection ⇒ Array
Contents of the collection.
- #delegate ⇒ Object
Returns the value of attribute delegate.
- #key ⇒ String readonly
the name of the property key to use when sending notifications for _will_change! and _fetch!.
- #loaded ⇒ Object
Returns the value of attribute loaded.
- #parse_class ⇒ Object
Returns the value of attribute parse_class.
Instance Method Summary collapse
- #&(other_ary) ⇒ Array
Set Intersection - Returns a new array containing unique elements common to the two arrays.
- #+(other_ary) ⇒ Array
Alias Array Concatenation.
- #-(other_ary) ⇒ Array
Alias Array Difference.
- #<<(*list) ⇒ Object
Append items to the collection.
- #==(other_list) ⇒ Boolean
True if two collection proxies have similar items.
- #add(*items) ⇒ Object (also: #push)
Add items to the collection.
- #add!(*items) ⇒ Object
Atomically adds all items from the array.
- #add_unique(*items) ⇒ Array (also: #push_unique)
Add items to the collection if they don't already exist.
- #add_unique!(*items) ⇒ Object
Atomically adds all items from the array that are not already part of the collection.
- #as_json(opts = nil) ⇒ Hash
A JSON representation.
- #changes_applied! ⇒ Object
mark that collection changes where applied, which clears dirty tracking.
- #clear ⇒ Object
clear all items in the collection.
- #clear_changes! ⇒ Object
clears all dirty tracked information.
- #count ⇒ Integer
Number of items in the collection.
- #destroy! ⇒ Object
Atomically deletes all items in the array, and marks the field as `undefined` directly with the Parse server.
- #each ⇒ Object
Alias for Array#each.
- #empty? ⇒ Boolean
true if the collection is empty.
- #first(*args) ⇒ Object
The first item in the collection.
- #flatten ⇒ Array
Alias Array flattening.
- #forward(method, params = nil) ⇒ Object
Forward a method call to the delegate.
- #initialize(collection = nil, delegate: nil, key: nil, parse_class: nil) ⇒ CollectionProxy constructor
Create a new CollectionProxy instance.
- #last(*args) ⇒ Object
The last item in the collection.
- #loaded? ⇒ Boolean
true if the collection has been loaded.
- #map ⇒ Object
Alias for Array#map.
- #notify_will_change! ⇒ Object
Notifies the delegate that the collection changed.
- #parse_objects ⇒ Array<Parse::Object>
Alias to `to_a.parse_objects` from Array#parse_objects.
- #parse_pointers ⇒ Array<Parse::Pointer>
Alias to `to_a.parse_pointers` from Array#parse_pointers.
- #reload! ⇒ Object
Reload and restore the collection to its original set of items.
- #remove(*items) ⇒ Object (also: #delete)
Remove items from the collection.
- #remove!(*items) ⇒ Object
Atomically deletes all items from the array.
- #reset! ⇒ Object
Reset the state of the collection.
- #rollback! ⇒ Object
Locally restores previous attributes (not from the persistent store).
- #second ⇒ Object
The second item in the collection.
- #select ⇒ Object
Alias for Array#select.
- #set_collection!(list) ⇒ Array
Set the internal collection of items without dirty tracking or change notifications.
- #to_a ⇒ Array (also: #to_ary)
- #uniq ⇒ Object
Alias for Array#uniq.
- #uniq! ⇒ Object
Alias for Array#uniq!.
- #|(items) ⇒ Array
Set Union - Returns a new array by joining two arrays, excluding any duplicates and preserving the order from the original array.
Constructor Details
#initialize(collection = nil, delegate: nil, key: nil, parse_class: nil) ⇒ CollectionProxy
Create a new CollectionProxy instance.
60 61 62 63 64 65 66 | # File 'lib/parse/model/associations/collection_proxy.rb', line 60 def initialize(collection = nil, delegate: nil, key: nil, parse_class: nil) @delegate = delegate @key = key.to_sym if key.present? @collection = collection.is_a?(Array) ? collection : [] @loaded = @collection.count > 0 @parse_class = parse_class end |
Instance Attribute Details
#collection ⇒ Array
If you modify this directly, it is highly recommended that you call #notify_will_change! to notify the dirty tracking system.
Returns contents of the collection.
46 47 48 | # File 'lib/parse/model/associations/collection_proxy.rb', line 46 def collection @collection end |
#delegate ⇒ Object
Returns the value of attribute delegate.
# File 'lib/parse/model/associations/collection_proxy.rb', line 31
|
#key ⇒ String (readonly)
the name of the property key to use when sending notifications for _will_change! and _fetch!
46 | # File 'lib/parse/model/associations/collection_proxy.rb', line 46 attr_accessor :collection, :delegate, :loaded, :parse_class |
#loaded ⇒ Object
Returns the value of attribute loaded.
# File 'lib/parse/model/associations/collection_proxy.rb', line 35
|
#parse_class ⇒ Object
Returns the value of attribute parse_class.
# File 'lib/parse/model/associations/collection_proxy.rb', line 38
|
Instance Method Details
#&(other_ary) ⇒ Array
Set Intersection - Returns a new array containing unique elements common to the two arrays. The order is preserved from the original array.
It compares elements using their hash and eql? methods for efficiency. See Array#&
186 187 188 | # File 'lib/parse/model/associations/collection_proxy.rb', line 186 def &(other_ary) collection & [other_ary].flatten end |
#+(other_ary) ⇒ Array
Alias Array Concatenation. Returns a new array built by concatenating the two arrays together to produce a third array.
209 210 211 | # File 'lib/parse/model/associations/collection_proxy.rb', line 209 def +(other_ary) collection + [other_ary].flatten.to_a end |
#-(other_ary) ⇒ Array
Alias Array Difference. Returns a new array that is a copy of the original array, removing any items that also appear in other_ary. The order is preserved from the original array.
198 199 200 | # File 'lib/parse/model/associations/collection_proxy.rb', line 198 def -(other_ary) collection - [other_ary].flatten end |
#<<(*list) ⇒ Object
Append items to the collection
317 318 319 320 321 322 | # File 'lib/parse/model/associations/collection_proxy.rb', line 317 def <<(*list) if list.count > 0 notify_will_change! list.flatten.each { |e| collection.push(e) } end end |
#==(other_list) ⇒ Boolean
Returns true if two collection proxies have similar items.
89 90 91 92 93 94 95 | # File 'lib/parse/model/associations/collection_proxy.rb', line 89 def ==(other_list) if other_list.is_a?(Array) return @collection == other_list elsif other_list.is_a?(Parse::CollectionProxy) return @collection == other_list.instance_variable_get(:@collection) end end |
#add(*items) ⇒ Object Also known as: push
Add items to the collection
143 144 145 146 147 148 149 | # File 'lib/parse/model/associations/collection_proxy.rb', line 143 def add(*items) notify_will_change! if items.count > 0 items.each do |item| collection.push item end @collection end |
#add!(*items) ⇒ Object
Atomically adds all items from the array. This request is sent directly to the Parse backend.
234 235 236 237 238 | # File 'lib/parse/model/associations/collection_proxy.rb', line 234 def add!(*items) return false unless @delegate.respond_to?(:op_add!) @delegate.send :op_add!, @key, items.flatten reset! end |
#add_unique(*items) ⇒ Array Also known as: push_unique
Add items to the collection if they don't already exist
155 156 157 158 159 160 | # File 'lib/parse/model/associations/collection_proxy.rb', line 155 def add_unique(*items) return unless items.count > 0 notify_will_change! @collection = collection | items.flatten @collection end |
#add_unique!(*items) ⇒ Object
Atomically adds all items from the array that are not already part of the collection. This request is sent directly to the Parse backend.
244 245 246 247 248 | # File 'lib/parse/model/associations/collection_proxy.rb', line 244 def add_unique!(*items) return false unless @delegate.respond_to?(:op_add_unique!) @delegate.send :op_add_unique!, @key, items.flatten reset! end |
#as_json(opts = nil) ⇒ Hash
Returns a JSON representation.
307 308 309 | # File 'lib/parse/model/associations/collection_proxy.rb', line 307 def as_json(opts = nil) collection.as_json(opts) end |
#changes_applied! ⇒ Object
mark that collection changes where applied, which clears dirty tracking.
280 281 282 | # File 'lib/parse/model/associations/collection_proxy.rb', line 280 def changes_applied! changes_applied end |
#clear ⇒ Object
clear all items in the collection
104 105 106 | # File 'lib/parse/model/associations/collection_proxy.rb', line 104 def clear @collection.clear end |
#clear_changes! ⇒ Object
clears all dirty tracked information.
275 276 277 | # File 'lib/parse/model/associations/collection_proxy.rb', line 275 def clear_changes! clear_changes_information end |
#count ⇒ Integer
Returns number of items in the collection.
302 303 304 | # File 'lib/parse/model/associations/collection_proxy.rb', line 302 def count collection.count end |
#destroy! ⇒ Object
Atomically deletes all items in the array, and marks the field as `undefined` directly with the Parse server. This request is sent directly to the Parse backend.
261 262 263 264 265 266 267 | # File 'lib/parse/model/associations/collection_proxy.rb', line 261 def destroy! return false unless @delegate.respond_to?(:op_destroy!) @delegate.send :op_destroy!, @key collection_will_change! @collection.clear reset! end |
#each ⇒ Object
Alias for Array#each
331 332 333 334 | # File 'lib/parse/model/associations/collection_proxy.rb', line 331 def each return collection.enum_for(:each) unless block_given? collection.each &Proc.new end |
#empty? ⇒ Boolean
true if the collection is empty.
312 313 314 | # File 'lib/parse/model/associations/collection_proxy.rb', line 312 def empty? collection.empty? end |
#first(*args) ⇒ Object
Returns the first item in the collection.
286 287 288 | # File 'lib/parse/model/associations/collection_proxy.rb', line 286 def first(*args) collection.first(*args) end |
#flatten ⇒ Array
Alias Array flattening.
215 216 217 | # File 'lib/parse/model/associations/collection_proxy.rb', line 215 def flatten collection.flatten end |
#forward(method, params = nil) ⇒ Object
Forward a method call to the delegate.
77 78 79 80 | # File 'lib/parse/model/associations/collection_proxy.rb', line 77 def forward(method, params = nil) return unless @delegate && @delegate.respond_to?(method) params.nil? ? @delegate.send(method) : @delegate.send(method, params) end |
#last(*args) ⇒ Object
Returns the last item in the collection.
297 298 299 | # File 'lib/parse/model/associations/collection_proxy.rb', line 297 def last(*args) collection.last(*args) end |
#loaded? ⇒ Boolean
true if the collection has been loaded
69 70 71 | # File 'lib/parse/model/associations/collection_proxy.rb', line 69 def loaded? @loaded end |
#map ⇒ Object
Alias for Array#map
337 338 339 340 | # File 'lib/parse/model/associations/collection_proxy.rb', line 337 def map return collection.enum_for(:map) unless block_given? collection.map &Proc.new end |
#notify_will_change! ⇒ Object
Notifies the delegate that the collection changed.
325 326 327 328 | # File 'lib/parse/model/associations/collection_proxy.rb', line 325 def notify_will_change! collection_will_change! forward "#{@key}_will_change!" end |
#parse_objects ⇒ Array<Parse::Object>
Alias to `to_a.parse_objects` from Array#parse_objects
368 369 370 | # File 'lib/parse/model/associations/collection_proxy.rb', line 368 def parse_objects collection.to_a.parse_objects end |
#parse_pointers ⇒ Array<Parse::Pointer>
Alias to `to_a.parse_pointers` from Array#parse_pointers
374 375 376 | # File 'lib/parse/model/associations/collection_proxy.rb', line 374 def parse_pointers collection.to_a.parse_pointers end |
#reload! ⇒ Object
Reload and restore the collection to its original set of items.
98 99 100 101 | # File 'lib/parse/model/associations/collection_proxy.rb', line 98 def reload! reset! collection #force reload end |
#remove(*items) ⇒ Object Also known as: delete
Remove items from the collection
221 222 223 224 225 226 227 | # File 'lib/parse/model/associations/collection_proxy.rb', line 221 def remove(*items) notify_will_change! if items.count > 0 items.each do |item| collection.delete item end @collection end |
#remove!(*items) ⇒ Object
Atomically deletes all items from the array. This request is sent directly to the Parse backend.
253 254 255 256 257 | # File 'lib/parse/model/associations/collection_proxy.rb', line 253 def remove!(*items) return false unless @delegate.respond_to?(:op_remove!) @delegate.send :op_remove!, @key, items.flatten reset! end |
#reset! ⇒ Object
Reset the state of the collection.
83 84 85 86 | # File 'lib/parse/model/associations/collection_proxy.rb', line 83 def reset! @loaded = false clear end |
#rollback! ⇒ Object
Locally restores previous attributes (not from the persistent store)
270 271 272 | # File 'lib/parse/model/associations/collection_proxy.rb', line 270 def rollback! restore_attributes end |
#second ⇒ Object
Returns the second item in the collection.
291 292 293 | # File 'lib/parse/model/associations/collection_proxy.rb', line 291 def second collection.second end |
#select ⇒ Object
Alias for Array#select
343 344 345 346 | # File 'lib/parse/model/associations/collection_proxy.rb', line 343 def select return collection.enum_for(:select) unless block_given? collection.select &Proc.new end |
#set_collection!(list) ⇒ Array
Set the internal collection of items without dirty tracking or change notifications.
117 118 119 | # File 'lib/parse/model/associations/collection_proxy.rb', line 117 def set_collection!(list) @collection = list end |
#to_a ⇒ Array Also known as: to_ary
109 110 111 | # File 'lib/parse/model/associations/collection_proxy.rb', line 109 def to_a collection.to_a end |
#uniq ⇒ Object
Alias for Array#uniq
349 350 351 352 | # File 'lib/parse/model/associations/collection_proxy.rb', line 349 def uniq return collection.uniq(&Proc.new) if block_given? return collection.uniq end |
#uniq! ⇒ Object
Alias for Array#uniq!
355 356 357 358 359 | # File 'lib/parse/model/associations/collection_proxy.rb', line 355 def uniq! notify_will_change! return collection.uniq!(&Proc.new) if block_given? return collection.uniq! end |
#|(items) ⇒ Array
Set Union - Returns a new array by joining two arrays, excluding any duplicates and preserving the order from the original array. It compares elements using their hash and eql? methods for efficiency. See Array#|
172 173 174 | # File 'lib/parse/model/associations/collection_proxy.rb', line 172 def |(items) collection | [items].flatten end |