Class: Mongoid::Association::Embedded::EmbedsMany::Proxy

Inherits:
Many
  • Object
show all
Includes:
Batchable
Defined in:
build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb

Overview

Since:

  • 7.0

Instance Attribute Summary

Attributes inherited from Proxy

#_association, #_base, #_target

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Batchable

#batch_clear, #batch_insert, #batch_remove, #batch_replace

Methods included from Positional

#positionally

Methods inherited from Many

#blank?, #create, #create!, #find_or_create_by, #find_or_create_by!, #find_or_initialize_by, #nil?, #respond_to?, #scoped, #serializable_hash

Methods inherited from Proxy

apply_ordering, #extend_proxies, #init, #klass, #reset_unloaded, #substitutable

Methods included from Marshalable

#marshal_dump, #marshal_load

Constructor Details

#initialize(base, target, association) ⇒ Many

Instantiate a new embeds_many association.

Examples:

Create the new association.

Many.new(person, addresses, association)

Parameters:

  • base (Document)

    The document this association hangs off of.

  • target (Array<Document>)

    The child documents of the association.

  • association (Association)

    The association metadata

Since:

  • 7.0



236
237
238
239
240
241
242
243
244
245
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 236

def initialize(base, target, association)
  init(base, target, association) do
    _target.each_with_index do |doc, index|
      integrate(doc)
      doc._index = index
    end
    @_unscoped = _target.dup
    @_target = scope(_target)
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missingCriteria, Object (private)

If the target array does not respond to the supplied method then try to find a named scope or criteria on the class and send the call there.

If the method exists on the array, use the default proxy behavior.

Parameters:

  • name (Symbol, String)

    The name of the method.

  • args (Array)

    The method args

  • block (Proc)

    Optional block to pass.

Returns:

  • (Criteria, Object)

    A Criteria or return value from the target.

Since:

  • 7.0



425
426
427
428
429
430
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 425

ruby2_keywords def method_missing(name, *args, &block)
  return super if _target.respond_to?(name)
  klass.send(:with_scope, criteria) do
    criteria.public_send(name, *args, &block)
  end
end

Class Method Details

.embedded?true

Returns true if the association is an embedded one. In this case always true.

Examples:

Is the association embedded?

Association::Embedded::EmbedsMany.embedded?

Returns:

  • (true)

    true.

Since:

  • 2.0.0.rc.1



542
543
544
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 542

def embedded?
  true
end

.foreign_key_suffixnil

Returns the suffix of the foreign key field, either “_id” or “_ids”.

Examples:

Get the suffix for the foreign key.

Association::Embedded::EmbedsMany.foreign_key_suffix

Returns:

  • (nil)

    nil.

Since:

  • 3.0.0



554
555
556
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 554

def foreign_key_suffix
  nil
end

Instance Method Details

#<<(*args) ⇒ Object Also known as: push

Appends a document or array of documents to the association. Will set the parent and update the index in the process.

Examples:

Append a document.

person.addresses << address

Push a document.

person.addresses.push(address)

Parameters:

Since:

  • 7.0



24
25
26
27
28
29
30
31
32
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 24

def <<(*args)
  docs = args.flatten
  return concat(docs) if docs.size > 1
  if doc = docs.first
    append(doc)
    doc.save if persistable? && !_assigning?
  end
  self
end

#as_documentArray<Hash>

Get this association as as its representation in the database.

Examples:

Convert the association to an attributes hash.

person.addresses.as_document

Returns:

  • (Array<Hash>)

    The association as stored in the db.

Since:

  • 2.0.0.rc.1



44
45
46
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 44

def as_document
  as_attributes.collect { |attrs| BSON::Document.new(attrs) }
end

#build(attributes = {}, type = nil) {|doc| ... } ⇒ Document Also known as: new

Builds a new document in the association and appends it to the target. Takes an optional type if you want to specify a subclass.

Examples:

Build a new document on the association.

person.people.build(:name => "Bozo")

Parameters:

  • attributes (Hash) (defaults to: {})

    The attributes to build the document with.

  • type (Class) (defaults to: nil)

    Optional class to build the document with.

Yields:

  • (doc)

Returns:

Since:

  • 7.0



74
75
76
77
78
79
80
81
82
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 74

def build(attributes = {}, type = nil)
  doc = Factory.build(type || _association.klass, attributes)
  append(doc)
  doc.apply_post_processed_defaults
  yield(doc) if block_given?
  doc.run_callbacks(:build) { doc }
  _base._reset_memoized_children!
  doc
end

#clearself

Clear the association. Will delete the documents from the db if they are already persisted.

If the host document is not persisted but its _id matches a persisted document, calling #clear on an association will remove the association's documents from the database even though the set of documents in the application (as loaded in the host) is different from what is in the database, and the host may not contain any persisted documents in the association either.

Examples:

Clear the association.

person.addresses.clear

Returns:

  • (self)

    The empty association.

Since:

  • 7.0



100
101
102
103
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 100

def clear
  batch_clear(_target.dup)
  self
end

#concat(docs) ⇒ Array<Document>

Appends an array of documents to the association. Performs a batch insert of the documents instead of persisting one at a time.

Examples:

Concat with other documents.

person.addresses.concat([ address_one, address_two ])

Parameters:

  • docs (Array<Document>)

    The docs to add.

Returns:

Since:

  • 2.4.0



59
60
61
62
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 59

def concat(docs)
  batch_insert(docs) unless docs.empty?
  self
end

#countInteger

Returns a count of the number of documents in the association that have actually been persisted to the database.

Use #size if you want the total number of documents.

Examples:

Get the count of persisted documents.

person.addresses.count

Returns:

  • (Integer)

    The total number of persisted embedded docs, as flagged by the #persisted? method.

Since:

  • 7.0



115
116
117
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 115

def count
  _target.select { |doc| doc.persisted? }.size
end

#delete(document) ⇒ Document?

Delete the supplied document from the target. This method is proxied in order to reindex the array after the operation occurs.

Examples:

Delete the document from the association.

person.addresses.delete(address)

Parameters:

  • document (Document)

    The document to be deleted.

Returns:

  • (Document, nil)

    The deleted document or nil if nothing deleted.

Since:

  • 2.0.0.rc.1



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 130

def delete(document)
  execute_callback :before_remove, document
  doc = _target.delete_one(document)
  if doc && !_binding?
    _unscoped.delete_one(doc)
    if _assigning?
      _base.add_atomic_pull(doc)
    else
      doc.delete(suppress: true)
      unbind_one(doc)
    end
  end
  reindex
  execute_callback :after_remove, document
  doc
end

#delete_all(conditions = {}) ⇒ Integer

Delete all the documents in the association without running callbacks.

Examples:

Delete all documents from the association.

person.addresses.delete_all

Conditionally delete documents from the association.

person.addresses.delete_all({ :street => "Bond" })

Parameters:

  • conditions (Hash) (defaults to: {})

    Conditions on which documents to delete.

Returns:

  • (Integer)

    The number of documents deleted.

Since:

  • 7.0



158
159
160
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 158

def delete_all(conditions = {})
  remove_all(conditions, :delete)
end

#delete_ifMany, Enumerator

Delete all the documents for which the provided block returns true.

Examples:

Delete the matching documents.

person.addresses.delete_if do |doc|
  doc.state == "GA"
end

Returns:

  • (Many, Enumerator)

    The association or an enumerator if no block was provided.

Since:

  • 3.1.0



173
174
175
176
177
178
179
180
181
182
183
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 173

def delete_if
  if block_given?
    dup_target = _target.dup
    dup_target.each do |doc|
      delete(doc) if yield(doc)
    end
    self
  else
    super
  end
end

#destroy_all(conditions = {}) ⇒ Integer

Destroy all the documents in the association whilst running callbacks.

Examples:

Destroy all documents from the association.

person.addresses.destroy_all

Conditionally destroy documents from the association.

person.addresses.destroy_all({ :street => "Bond" })

Parameters:

  • conditions (Hash) (defaults to: {})

    Conditions on which documents to destroy.

Returns:

  • (Integer)

    The number of documents destroyed.

Since:

  • 7.0



196
197
198
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 196

def destroy_all(conditions = {})
  remove_all(conditions, :destroy)
end

#exists?true, false

Determine if any documents in this association exist in the database.

Examples:

Are there persisted documents?

person.posts.exists?

Returns:

  • (true, false)

    True is persisted documents exist, false if not.

Since:

  • 7.0



206
207
208
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 206

def exists?
  count > 0
end

#find(*args) ⇒ Array<Document>, Document

Finds a document in this association through several different methods.

Examples:

Find a document by its id.

person.addresses.find(BSON::ObjectId.new)

Find documents for multiple ids.

person.addresses.find([ BSON::ObjectId.new, BSON::ObjectId.new ])

Parameters:

  • args (Array<Object>)

    Various arguments.

Returns:

Since:

  • 7.0



222
223
224
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 222

def find(*args)
  criteria.find(*args)
end

#in_memoryArray<Document>

Get all the documents in the association that are loaded into memory.

Examples:

Get the in memory documents.

relation.in_memory

Returns:

  • (Array<Document>)

    The documents in memory.

Since:

  • 2.1.0



255
256
257
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 255

def in_memory
  _target
end

#pop(count = nil) ⇒ Document+

Pop documents off the association. This can be a single document or multiples, and will automatically persist the changes.

Examples:

Pop a single document.

relation.pop

Pop multiple documents.

relation.pop(3)

Parameters:

  • count (Integer) (defaults to: nil)

    The number of documents to pop, or 1 if not provided.

Returns:

Since:

  • 3.0.0



274
275
276
277
278
279
280
281
282
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 274

def pop(count = nil)
  if count
    if docs = _target[_target.size - count, _target.size]
      docs.each { |doc| delete(doc) }
    end
  else
    delete(_target[-1])
  end
end

#shift(count = nil) ⇒ Document+

Shift documents off the association. This can be a single document or multiples, and will automatically persist the changes.

Examples:

Shift a single document.

relation.shift

Shift multiple documents.

relation.shift(3)

Parameters:

  • count (Integer) (defaults to: nil)

    The number of documents to shift, or 1 if not provided.

Returns:

Since:

  • 7.0



297
298
299
300
301
302
303
304
305
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 297

def shift(count = nil)
  if count
    if _target.size > 0 && docs = _target[0, count]
      docs.each { |doc| delete(doc) }
    end
  else
    delete(_target[0])
  end
end

#substitute(docs) ⇒ Many

Substitutes the supplied target documents for the existing documents in the relation.

Examples:

Substitute the association's target.

person.addresses.substitute([ address ])

Parameters:

  • docs (Array<Document>)

    The replacement docs.

Returns:

  • (Many)

    The proxied association.

Since:

  • 2.0.0.rc.1



318
319
320
321
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 318

def substitute(docs)
  batch_replace(docs)
  self
end

#unscopedCriteria

Return the association with all previous scoping removed. This is the exact representation of the docs in the database.

Examples:

Get the unscoped documents.

person.addresses.unscoped

Returns:

  • (Criteria)

    The unscoped association.

Since:

  • 2.4.0



332
333
334
335
336
337
# File 'build/mongoid-7.3/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 332

def unscoped
  criterion = klass.unscoped
  criterion.embedded = true
  criterion.documents = _unscoped.delete_if(&:marked_for_destruction?)
  criterion
end