Class: Mongoid::Association::Embedded::EmbedsMany::Proxy
- Includes:
- Batchable
- Defined in:
- lib/mongoid/association/embedded/embeds_many/proxy.rb
Overview
Instance Attribute Summary
Attributes inherited from Proxy
#_association, #_base, #_target
Class Method Summary collapse
-
.embedded? ⇒ true
Returns true if the relation 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 relation.
-
#as_document ⇒ Array<Hash>
Get this relation as as its representation in the database.
-
#build(attributes = {}, type = nil) {|doc| ... } ⇒ Document
(also: #new)
Builds a new document in the relation and appends it to the target.
-
#clear ⇒ self
Clear the relation.
-
#concat(docs) ⇒ Array<Document>
Appends an array of documents to the relation.
-
#count ⇒ Integer
Returns a count of the number of documents in the association that have actually been persisted to the database.
-
#delete(document) ⇒ Document?
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 relation exist in the database.
-
#find(*args) ⇒ Array<Document>, Document
Finds a document in this association through several different methods.
-
#in_memory ⇒ Array<Document>
Get all the documents in the relation that are loaded into memory.
-
#initialize(base, target, association) ⇒ Many
constructor
Instantiate a new embeds_many relation.
-
#pop(count = nil) ⇒ Document+
Pop documents off the relation.
-
#shift(count = nil) ⇒ Document+
Shift documents off the relation.
-
#substitute(docs) ⇒ Many
Substitutes the supplied target documents for the existing documents in the relation.
-
#unscoped ⇒ Criteria
Return the relation 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 relation.
226 227 228 229 230 231 232 233 234 235 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 226 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_missing(name, *args, &block) ⇒ 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.
418 419 420 421 422 423 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 418 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 relation is an embedded one. In this case always true.
532 533 534 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 532 def true end |
.foreign_key_suffix ⇒ nil
Returns the suffix of the foreign key field, either “_id” or “_ids”.
544 545 546 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 544 def foreign_key_suffix nil end |
Instance Method Details
#<<(*args) ⇒ Object Also known as: push
Appends a document or array of documents to the relation. Will set the parent and update the index in the process.
21 22 23 24 25 26 27 28 29 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 21 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_document ⇒ Array<Hash>
Get this relation as as its representation in the database.
41 42 43 |
# File '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 relation and appends it to the target. Takes an optional type if you want to specify a subclass.
71 72 73 74 75 76 77 78 79 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 71 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 |
#clear ⇒ self
Clear the relation. Will delete the documents from the db if they are already persisted.
90 91 92 93 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 90 def clear batch_clear(_target.dup) self end |
#concat(docs) ⇒ Array<Document>
Appends an array of documents to the relation. Performs a batch insert of the documents instead of persisting one at a time.
56 57 58 59 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 56 def concat(docs) batch_insert(docs) unless docs.empty? self end |
#count ⇒ 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.
105 106 107 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 105 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.
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 120 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.
148 149 150 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 148 def delete_all(conditions = {}) remove_all(conditions, :delete) end |
#delete_if ⇒ Many, Enumerator
Delete all the documents for which the provided block returns true.
163 164 165 166 167 168 169 170 171 172 173 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 163 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.
186 187 188 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 186 def destroy_all(conditions = {}) remove_all(conditions, :destroy) end |
#exists? ⇒ true, false
Determine if any documents in this relation exist in the database.
196 197 198 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 196 def exists? count > 0 end |
#find(*args) ⇒ Array<Document>, Document
Finds a document in this association through several different methods.
212 213 214 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 212 def find(*args) criteria.find(*args) end |
#in_memory ⇒ Array<Document>
Get all the documents in the relation that are loaded into memory.
245 246 247 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 245 def in_memory _target end |
#pop(count = nil) ⇒ Document+
Pop documents off the relation. This can be a single document or multiples, and will automatically persist the changes.
264 265 266 267 268 269 270 271 272 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 264 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 relation. This can be a single document or multiples, and will automatically persist the changes.
287 288 289 290 291 292 293 294 295 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 287 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.
308 309 310 311 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 308 def substitute(docs) batch_replace(docs) self end |
#unscoped ⇒ Criteria
Return the relation with all previous scoping removed. This is the exact representation of the docs in the database.
322 323 324 325 326 327 |
# File 'lib/mongoid/association/embedded/embeds_many/proxy.rb', line 322 def unscoped criterion = klass.unscoped criterion. = true criterion.documents = _unscoped.delete_if(&:marked_for_destruction?) criterion end |