Class: Mongoid::Association::Embedded::EmbedsMany::Proxy
- Includes:
- Batchable
- Defined in:
- build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb
Instance Attribute Summary
Attributes inherited from Proxy
#_association, #_base, #_target
Class Method Summary collapse
-
.embedded? ⇒ true
Returns true if the association is an embedded one.
-
.foreign_key_suffix ⇒ nil
Returns the suffix of the foreign key field, either “_id” or “_ids”.
Instance Method Summary collapse
-
#<<(*args) ⇒ Object
(also: #push)
Appends a document or array of documents to the association.
-
#_remove(document) ⇒ Object
private
Removes a single document from the collection *in memory only*.
-
#as_document ⇒ Array<Hash>
Get this association as as its representation in the database.
-
#build(attributes = {}, type = nil) {|doc| ... } ⇒ Document
(also: #new)
Builds a new document in the association and appends it to the target.
-
#clear ⇒ self
Clear the association.
-
#concat(docs) ⇒ Array<Document>
Appends an array of documents to the association.
-
#count(*args, &block) ⇒ Integer
Returns a count of the number of documents in the association that have actually been persisted to the database.
-
#delete(document) ⇒ Document | nil
(also: #delete_one)
Delete the supplied document from the target.
-
#delete_all(conditions = {}) ⇒ Integer
Delete all the documents in the association without running callbacks.
-
#delete_if ⇒ Many | Enumerator
Delete all the documents for which the provided block returns true.
-
#destroy_all(conditions = {}) ⇒ Integer
Destroy all the documents in the association whilst running callbacks.
-
#exists? ⇒ true | false
Determine if any documents in this association exist in the database.
-
#find(*args, &block) ⇒ Document | Array<Document> | nil
Finds a document in this association through several different methods.
-
#in_memory ⇒ Array<Document>
Get all the documents in the association that are loaded into memory.
-
#initialize(base, target, association) ⇒ Many
constructor
Instantiate a new embeds_many association.
-
#pop(count = nil) ⇒ Document | Array<Document>
Pop documents off the association.
-
#shift(count = nil) ⇒ Document | Array<Document>
Shift documents off the association.
-
#substitute(docs) ⇒ Many
Substitutes the supplied target documents for the existing documents in the relation.
-
#unscoped ⇒ Criteria
Return the association with all previous scoping removed.
Methods included from Batchable
#batch_clear, #batch_insert, #batch_remove, #batch_replace
Methods included from Positional
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
Constructor Details
#initialize(base, target, association) ⇒ Many
Instantiate a new embeds_many association.
273 274 275 276 277 278 279 280 281 282 283 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 273 def initialize(base, target, association) init(base, target, association) do _target.each_with_index do |doc, index| integrate(doc) doc._index = index end update_attributes_hash @_unscoped = _target.dup @_target = scope(_target) end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing ⇒ Criteria | 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.
439 440 441 442 443 444 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 439 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.
555 556 557 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 555 def true end |
.foreign_key_suffix ⇒ nil
Returns the suffix of the foreign key field, either “_id” or “_ids”.
565 566 567 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 565 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.
23 24 25 26 27 28 29 30 31 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 23 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 |
#_remove(document) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Removes a single document from the collection *in memory only*. It will not persist the change.
167 168 169 170 171 172 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 167 def _remove(document) _target.delete_one(document) _unscoped.delete_one(document) update_attributes_hash reindex end |
#as_document ⇒ Array<Hash>
Get this association as as its representation in the database.
41 42 43 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 41 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.
69 70 71 72 73 74 75 76 77 78 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 69 def build(attributes = {}, type = nil) doc = Factory.execute_build(type || _association.klass, attributes, execute_callbacks: false) append(doc) doc.apply_post_processed_defaults yield(doc) if block_given? doc.run_pending_callbacks doc.run_callbacks(:build) { doc } _base._reset_memoized_descendants! doc end |
#clear ⇒ self
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.
96 97 98 99 100 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 96 def clear batch_clear(_target.dup) update_attributes_hash 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.
54 55 56 57 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 54 def concat(docs) batch_insert(docs) unless docs.empty? self end |
#count(*args, &block) ⇒ Integer
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.
If args or block are present, #count will delegate to the #count method on target
and will include both persisted and non-persisted documents.
124 125 126 127 128 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 124 def count(*args, &block) return _target.count(*args, &block) if args.any? || block _target.select { |doc| doc.persisted? }.size end |
#delete(document) ⇒ Document | nil Also known as: delete_one
Delete the supplied document from the target. This method is proxied in order to reindex the array after the operation occurs.
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 139 def delete(document) execute_callbacks_around(:remove, document) do 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 update_attributes_hash end reindex doc end end |
#delete_all(conditions = {}) ⇒ Integer
Delete all the documents in the association without running callbacks.
185 186 187 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 185 def delete_all(conditions = {}) remove_all(conditions, :delete) end |
#delete_if ⇒ Many | Enumerator
Delete all the documents for which the provided block returns true.
198 199 200 201 202 203 204 205 206 207 208 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 198 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.
221 222 223 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 221 def destroy_all(conditions = {}) remove_all(conditions, :destroy) end |
#exists? ⇒ true | false
Determine if any documents in this association exist in the database.
231 232 233 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 231 def exists? _target.any? { |doc| doc.persisted? } end |
#find(*args, &block) ⇒ Document | Array<Document> | nil
Finds a document in this association through several different methods.
This method delegates to Mongoid::Criteria#find. If this method is not given a block, it returns one or many documents for the provided _id values.
If this method is given a block, it returns the first document of those found by the current Criteria object for which the block returns a truthy value.
259 260 261 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 259 def find(*args, &block) criteria.find(*args, &block) end |
#in_memory ⇒ Array<Document>
Get all the documents in the association that are loaded into memory.
291 292 293 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 291 def in_memory _target end |
#pop(count = nil) ⇒ Document | Array<Document>
Pop documents off the association. This can be a single document or multiples, and will automatically persist the changes.
308 309 310 311 312 313 314 315 316 317 318 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 308 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.tap do update_attributes_hash end end |
#shift(count = nil) ⇒ Document | Array<Document>
Shift documents off the association. This can be a single document or multiples, and will automatically persist the changes.
333 334 335 336 337 338 339 340 341 342 343 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 333 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.tap do update_attributes_hash end end |
#substitute(docs) ⇒ Many
Substitutes the supplied target documents for the existing documents in the relation.
354 355 356 357 358 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 354 def substitute(docs) batch_replace(docs) update_attributes_hash self end |
#unscoped ⇒ Criteria
Return the association with all previous scoping removed. This is the exact representation of the docs in the database.
367 368 369 370 371 372 |
# File 'build/mongoid-8.1/lib/mongoid/association/embedded/embeds_many/proxy.rb', line 367 def unscoped criterion = klass.unscoped criterion. = true criterion.documents = _unscoped.delete_if(&:marked_for_destruction?) criterion end |