Class: Parse::CollectionProxy

Inherits:
Object
  • Object
show all
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

PointerCollectionProxy

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(collection = nil, delegate: nil, key: nil, parse_class: nil) ⇒ CollectionProxy

Create a new CollectionProxy instance.

Parameters:

  • collection (Array) (defaults to: nil)

    the initial items to add to the collection.

  • delegate (Object) (defaults to: nil)

    the owner of the object that will receive the notifications.

  • key (Symbol) (defaults to: nil)

    the name of the key to use when sending notifications for _will_change! and _fetch!

  • parse_class (String) (defaults to: nil)

    (Optional) the Parse class type are the items of the collection. This is used to typecast the objects in the array to a particular Parse Object type.

See Also:



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

#collectionArray

Note:

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.

Returns:

  • (Array)

    contents of the collection.



46
47
48
# File 'lib/parse/model/associations/collection_proxy.rb', line 46

def collection
  @collection
end

#delegateObject

Returns the value of attribute delegate.

# File 'lib/parse/model/associations/collection_proxy.rb', line 31

#keyString (readonly)

the name of the property key to use when sending notifications for _will_change! and _fetch!

Returns:



46
# File 'lib/parse/model/associations/collection_proxy.rb', line 46

attr_accessor :collection, :delegate, :loaded, :parse_class

#loadedObject

Returns the value of attribute loaded.

# File 'lib/parse/model/associations/collection_proxy.rb', line 35

#parse_classObject

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#&

Examples:

[ 1, 1, 3, 5 ] & [ 3, 2, 1 ]                 #=> [ 1, 3 ]
[ 'a', 'b', 'b', 'z' ] & [ 'a', 'b', 'c' ]   #=> [ 'a', 'b' ]

Parameters:

Returns:

  • (Array)

    intersection 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.

Examples:

[ 1, 2, 3 ] + [ 4, 5 ] #=> [ 1, 2, 3, 4, 5 ]

Parameters:

Returns:

  • (Array)

    concatenated 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.

Examples:

[ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ]  #=>  [ 3, 3, 5 ]

Parameters:

Returns:

  • (Array)

    delta 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.

Returns:

  • (Boolean)

    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

Parameters:

  • items (Array)

    items to add



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.

Parameters:

  • items (Array)

    items to uniquely add

See Also:



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

Parameters:

  • items (Array)

    items to uniquely add

Returns:

  • (Array)

    the collection.



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.

Parameters:

  • items (Array)

    items to uniquely add

See Also:



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.

Returns:

  • (Hash)

    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

#clearObject

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

#countInteger

Returns number of items in the collection.

Returns:

  • (Integer)

    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

#eachObject

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.

Returns:

  • (Boolean)


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.

Parameters:

  • args (Hash)

    arguments to pass to Array#first.

Returns:

  • (Object)

    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

#flattenArray

Returns:

  • (Array)

    a flattened one-dimensional array



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.

Parameters:

  • method (Symbol)

    the name of the method to forward

  • params (Object) (defaults to: nil)

    method parameters

Returns:

  • (Object)

    the return value from the forwarded method.



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.

Parameters:

  • args (Hash)

    arguments to pass to Array#last.

Returns:

  • (Object)

    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

Returns:

  • (Boolean)


69
70
71
# File 'lib/parse/model/associations/collection_proxy.rb', line 69

def loaded?
  @loaded
end

#mapObject

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_objectsArray<Parse::Object>

Alias to `to_a.parse_objects` from Array#parse_objects

Returns:

  • (Array<Parse::Object>)

    an array of Parse Object subclasses representing this collection.



368
369
370
# File 'lib/parse/model/associations/collection_proxy.rb', line 368

def parse_objects
  collection.to_a.parse_objects
end

#parse_pointersArray<Parse::Pointer>

Alias to `to_a.parse_pointers` from Array#parse_pointers

Returns:



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

Parameters:

  • items (Array)

    items to remove



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.

Parameters:

  • items (Array)

    items to remove



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

#secondObject

Returns the second item in the collection.

Returns:

  • (Object)

    the second item in the collection



291
292
293
# File 'lib/parse/model/associations/collection_proxy.rb', line 291

def second
  collection.second
end

#selectObject

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.

Returns:

  • (Array)

    the collection



117
118
119
# File 'lib/parse/model/associations/collection_proxy.rb', line 117

def set_collection!(list)
  @collection = list
end

#to_aArray Also known as: to_ary

Returns:



109
110
111
# File 'lib/parse/model/associations/collection_proxy.rb', line 109

def to_a
  collection.to_a
end

#uniqObject

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#|

Examples:

[ "a", "b", "c" ] | [ "c", "d", "a" ] #=> [ "a", "b", "c", "d" ]

Parameters:

  • items (Array)

    items to uniquely add

Returns:

  • (Array)

    array with unique items

See Also:



172
173
174
# File 'lib/parse/model/associations/collection_proxy.rb', line 172

def |(items)
  collection | [items].flatten
end