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)

    the owner of the object that will receive the notifications.

  • key (Symbol)

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

  • parse_class (String)

    (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:


61
62
63
64
65
66
67
# File 'lib/parse/model/associations/collection_proxy.rb', line 61

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.


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

def collection
  @collection
end

#delegateObject

Returns the value of attribute delegate


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

#keyString (readonly)

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

Returns:


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

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

#loadedObject

Returns the value of attribute loaded


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

#parse_classObject

Returns the value of attribute parse_class


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

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


184
185
186
# File 'lib/parse/model/associations/collection_proxy.rb', line 184

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


207
208
209
# File 'lib/parse/model/associations/collection_proxy.rb', line 207

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


196
197
198
# File 'lib/parse/model/associations/collection_proxy.rb', line 196

def -(other_ary)
  collection - [other_ary].flatten
end

#<<(*list) ⇒ Object

Append items to the collection


314
315
316
317
318
319
# File 'lib/parse/model/associations/collection_proxy.rb', line 314

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.


90
91
92
93
94
95
96
# File 'lib/parse/model/associations/collection_proxy.rb', line 90

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:


231
232
233
234
235
# File 'lib/parse/model/associations/collection_proxy.rb', line 231

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.


154
155
156
157
158
159
# File 'lib/parse/model/associations/collection_proxy.rb', line 154

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:


241
242
243
244
245
# File 'lib/parse/model/associations/collection_proxy.rb', line 241

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


304
305
306
# File 'lib/parse/model/associations/collection_proxy.rb', line 304

def as_json(opts = nil)
  collection.as_json(opts)
end

#changes_applied!Object

mark that collection changes where applied, which clears dirty tracking.


277
278
279
# File 'lib/parse/model/associations/collection_proxy.rb', line 277

def changes_applied!
  changes_applied
end

#clearObject

clear all items in the collection


105
106
107
# File 'lib/parse/model/associations/collection_proxy.rb', line 105

def clear
  @collection.clear
end

#clear_changes!Object

clears all dirty tracked information.


272
273
274
# File 'lib/parse/model/associations/collection_proxy.rb', line 272

def clear_changes!
  clear_changes_information
end

#countInteger

Returns number of items in the collection.

Returns:

  • (Integer)

    number of items in the collection.


299
300
301
# File 'lib/parse/model/associations/collection_proxy.rb', line 299

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.


258
259
260
261
262
263
264
# File 'lib/parse/model/associations/collection_proxy.rb', line 258

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


328
329
330
331
# File 'lib/parse/model/associations/collection_proxy.rb', line 328

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)

309
310
311
# File 'lib/parse/model/associations/collection_proxy.rb', line 309

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


283
284
285
# File 'lib/parse/model/associations/collection_proxy.rb', line 283

def first(*args)
  collection.first(*args)
end

#flattenArray

Returns:

  • (Array)

    a flattened one-dimensional array


213
214
215
# File 'lib/parse/model/associations/collection_proxy.rb', line 213

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.


78
79
80
81
# File 'lib/parse/model/associations/collection_proxy.rb', line 78

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


294
295
296
# File 'lib/parse/model/associations/collection_proxy.rb', line 294

def last(*args)
  collection.last(*args)
end

#loaded?Boolean

true if the collection has been loaded

Returns:

  • (Boolean)

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

def loaded?
  @loaded
end

#mapObject

Alias for Array#map


334
335
336
337
# File 'lib/parse/model/associations/collection_proxy.rb', line 334

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.


322
323
324
325
# File 'lib/parse/model/associations/collection_proxy.rb', line 322

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.


365
366
367
# File 'lib/parse/model/associations/collection_proxy.rb', line 365

def parse_objects
  collection.to_a.parse_objects
end

#parse_pointersArray<Parse::Pointer>

Alias to `to_a.parse_pointers` from Array#parse_pointers

Returns:


371
372
373
# File 'lib/parse/model/associations/collection_proxy.rb', line 371

def parse_pointers
  collection.to_a.parse_pointers
end

#reload!Object

Reload and restore the collection to its original set of items.


99
100
101
102
# File 'lib/parse/model/associations/collection_proxy.rb', line 99

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


219
220
221
222
223
224
225
# File 'lib/parse/model/associations/collection_proxy.rb', line 219

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


250
251
252
253
254
# File 'lib/parse/model/associations/collection_proxy.rb', line 250

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.


84
85
86
87
# File 'lib/parse/model/associations/collection_proxy.rb', line 84

def reset!
  @loaded = false
  clear
end

#rollback!Object

Locally restores previous attributes (not from the persistent store)


267
268
269
# File 'lib/parse/model/associations/collection_proxy.rb', line 267

def rollback!
  restore_attributes
end

#secondObject

Returns the second item in the collection

Returns:

  • (Object)

    the second item in the collection


288
289
290
# File 'lib/parse/model/associations/collection_proxy.rb', line 288

def second
  collection.second
end

#selectObject

Alias for Array#select


340
341
342
343
# File 'lib/parse/model/associations/collection_proxy.rb', line 340

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:


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

def to_a
  collection.to_a
end

#uniqObject

Alias for Array#uniq


346
347
348
349
# File 'lib/parse/model/associations/collection_proxy.rb', line 346

def uniq
  return collection.uniq(&Proc.new) if block_given?
  return collection.uniq
end

#uniq!Object

Alias for Array#uniq!


352
353
354
355
356
# File 'lib/parse/model/associations/collection_proxy.rb', line 352

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:


170
171
172
# File 'lib/parse/model/associations/collection_proxy.rb', line 170

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