Class: Mongoid::Relations::Embedded::Many
- Includes:
- Atomic
- Defined in:
- lib/mongoid/relations/embedded/many.rb
Overview
This class handles the behaviour for a document that embeds many other documents within in it as an array.
Constant Summary
Constants included from Atomic
Instance Attribute Summary
Attributes inherited from Proxy
#base, #loaded, #metadata, #target
Class Method Summary collapse
-
.builder(base, meta, object) ⇒ Builder
Return the builder that is responsible for generating the documents that will be used by this relation.
-
.embedded? ⇒ true
Returns true if the relation is an embedded one.
-
.macro ⇒ Symbol
Returns the macro for this relation.
-
.nested_builder(metadata, attributes, options) ⇒ NestedBuilder
Return the nested builder that is responsible for generating the documents that will be used by this relation.
-
.path(document) ⇒ Mongoid::Atomic::Paths::Embedded::Many
Get the path calculator for the supplied document.
-
.stores_foreign_key? ⇒ false
Tells the caller if this relation is one that stores the foreign key on its own objects.
-
.valid_options ⇒ Array<Symbol>
Get the valid options allowed with this relation.
-
.validation_default ⇒ true, false
Get the default validation setting for the relation.
Instance Method Summary collapse
-
#<<(*args) ⇒ Object
(also: #concat, #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 = {}, options = {}, type = nil) ⇒ Document
(also: #new)
Builds a new document in the relation and appends it to the target.
-
#clear ⇒ Many
Clear the relation.
-
#count ⇒ Integer
Returns a count of the number of documents in the association that have actually been persisted to the database.
-
#create(attributes = {}, options = {}, type = nil, &block) ⇒ Document
Create a new document in the relation.
-
#create!(attributes = {}, options = {}, type = nil, &block) ⇒ Document
Create a new document in the relation.
-
#delete(document) ⇒ Document?
Delete the supplied document from the target.
-
#delete_all(conditions = {}) ⇒ Integer
Delete all the documents in the association without running callbacks.
-
#destroy_all(conditions = {}) ⇒ Integer
Destroy all the documents in the association whilst running callbacks.
-
#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, metadata) ⇒ Many
constructor
Instantiate a new embeds_many relation.
-
#substitute(replacement) ⇒ Many
Substitutes the supplied target documents for the existing documents in the relation.
-
#unscoped ⇒ Criteria
Get a criteria for the embedded documents without the default scoping applied.
Methods inherited from Many
#blank?, #exists?, #find_or_create_by, #find_or_initialize_by, #nil?, #respond_to?, #scoped, #serializable_hash
Methods inherited from Proxy
Constructor Details
#initialize(base, target, metadata) ⇒ Many
Instantiate a new embeds_many relation.
221 222 223 224 225 226 227 228 |
# File 'lib/mongoid/relations/embedded/many.rb', line 221 def initialize(base, target, ) init(base, target, ) do target.each_with_index do |doc, index| integrate(doc) doc._index = index end 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.
377 378 379 380 381 382 |
# File 'lib/mongoid/relations/embedded/many.rb', line 377 def method_missing(name, *args, &block) return super if target.respond_to?(name) klass.send(:with_scope, criteria) do criteria.send(name, *args, &block) end end |
Class Method Details
.builder(base, meta, object) ⇒ Builder
Return the builder that is responsible for generating the documents that will be used by this relation.
448 449 450 |
# File 'lib/mongoid/relations/embedded/many.rb', line 448 def builder(base, , object) Builders::Embedded::Many.new(base, , object) end |
.embedded? ⇒ true
Returns true if the relation is an embedded one. In this case always true.
461 462 463 |
# File 'lib/mongoid/relations/embedded/many.rb', line 461 def true end |
.macro ⇒ Symbol
Returns the macro for this relation. Used mostly as a helper in reflection.
474 475 476 |
# File 'lib/mongoid/relations/embedded/many.rb', line 474 def macro :embeds_many end |
.nested_builder(metadata, attributes, options) ⇒ NestedBuilder
Return the nested builder that is responsible for generating the documents that will be used by this relation.
500 501 502 |
# File 'lib/mongoid/relations/embedded/many.rb', line 500 def nested_builder(, attributes, ) Builders::NestedAttributes::Many.new(, attributes, ) end |
.path(document) ⇒ Mongoid::Atomic::Paths::Embedded::Many
Get the path calculator for the supplied document.
515 516 517 |
# File 'lib/mongoid/relations/embedded/many.rb', line 515 def path(document) Mongoid::Atomic::Paths::Embedded::Many.new(document) end |
.stores_foreign_key? ⇒ false
Tells the caller if this relation is one that stores the foreign key on its own objects.
528 529 530 |
# File 'lib/mongoid/relations/embedded/many.rb', line 528 def stores_foreign_key? false end |
.valid_options ⇒ Array<Symbol>
Get the valid options allowed with this relation.
540 541 542 |
# File 'lib/mongoid/relations/embedded/many.rb', line 540 def [ :as, :cascade_callbacks, :cyclic, :order, :versioned ] end |
.validation_default ⇒ true, false
Get the default validation setting for the relation. Determines if by default a validates associated will occur.
553 554 555 |
# File 'lib/mongoid/relations/embedded/many.rb', line 553 def validation_default true end |
Instance Method Details
#<<(*args) ⇒ Object Also known as: concat, push
Appends a document or array of documents to the relation. Will set the parent and update the index in the process.
24 25 26 27 28 29 30 31 32 |
# File 'lib/mongoid/relations/embedded/many.rb', line 24 def <<(*args) atomically(:$pushAll) do args.flatten.each do |doc| next unless doc append(doc) doc.save if persistable? && !_assigning? end end end |
#as_document ⇒ Array<Hash>
Get this relation as as its representation in the database.
288 289 290 291 292 293 294 |
# File 'lib/mongoid/relations/embedded/many.rb', line 288 def as_document [].tap do |attributes| target.each do |doc| attributes << doc.as_document end end end |
#build(attributes = {}, options = {}, type = nil) ⇒ Document #build(attributes = {}, type = nil) ⇒ 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.
52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/mongoid/relations/embedded/many.rb', line 52 def build(attributes = {}, = {}, type = nil) if .is_a? Class , type = {}, end Factory.build(type || .klass, attributes, ).tap do |doc| doc.identify append(doc) yield(doc) if block_given? end end |
#clear ⇒ Many
Clear the relation. Will delete the documents from the db if they are already persisted.
72 73 74 75 76 |
# File 'lib/mongoid/relations/embedded/many.rb', line 72 def clear tap do |proxy| atomically(:$unset) { proxy.delete_all } end 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.
88 89 90 |
# File 'lib/mongoid/relations/embedded/many.rb', line 88 def count target.select { |doc| doc.persisted? }.size end |
#create(attributes = {}, options = {}, type = nil) ⇒ Document #create(attributes = {}, type = nil) ⇒ Document
Create a new document in the relation. This is essentially the same as doing a #build then #save on the new document.
108 109 110 |
# File 'lib/mongoid/relations/embedded/many.rb', line 108 def create(attributes = {}, = {}, type = nil, &block) build(attributes, , type, &block).tap { |doc| doc.save } end |
#create!(attributes = {}, options = {}, type = nil) ⇒ Document #create!(attributes = {}, type = nil) ⇒ Document
Create a new document in the relation. This is essentially the same as doing a #build then #save on the new document. If validation failed on the document an error will get raised.
131 132 133 |
# File 'lib/mongoid/relations/embedded/many.rb', line 131 def create!(attributes = {}, = {}, type = nil, &block) build(attributes, , type, &block).tap { |doc| doc.save! } 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.
146 147 148 149 150 151 152 153 154 155 156 157 158 |
# File 'lib/mongoid/relations/embedded/many.rb', line 146 def delete(document) target.delete_one(document).tap do |doc| if doc && !_binding? if _assigning? base.add_atomic_pull(doc) else doc.delete(:suppress => true) end unbind_one(doc) end reindex end end |
#delete_all(conditions = {}) ⇒ Integer
Delete all the documents in the association without running callbacks.
171 172 173 |
# File 'lib/mongoid/relations/embedded/many.rb', line 171 def delete_all(conditions = {}) atomically(:$pull) { remove_all(conditions, :delete) } end |
#destroy_all(conditions = {}) ⇒ Integer
Destroy all the documents in the association whilst running callbacks.
186 187 188 |
# File 'lib/mongoid/relations/embedded/many.rb', line 186 def destroy_all(conditions = {}) atomically(:$pull) { remove_all(conditions, :destroy) } end |
#find(*args) ⇒ Array<Document>, Document
Finds a document in this association through several different methods.
207 208 209 |
# File 'lib/mongoid/relations/embedded/many.rb', line 207 def find(*args) criteria.find(*args) end |
#in_memory ⇒ Array<Document>
Get all the documents in the relation that are loaded into memory.
238 239 240 |
# File 'lib/mongoid/relations/embedded/many.rb', line 238 def in_memory target end |
#substitute(replacement) ⇒ Many
Substitutes the supplied target documents for the existing documents in the relation.
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
# File 'lib/mongoid/relations/embedded/many.rb', line 254 def substitute(replacement) tap do |proxy| if replacement.blank? if _assigning? && !proxy.empty? base.atomic_unsets.push(proxy.first.atomic_path) end proxy.clear else atomically(:$set) do if replacement.first.is_a?(Hash) replacement = Many.builder(base, , replacement).build end proxy.target = replacement.compact if _assigning? base.delayed_atomic_sets[.name.to_s] = proxy.as_document end proxy.target.each_with_index do |doc, index| integrate(doc) doc._index = index doc.save if base.persisted? && !_assigning? end end end end end |
#unscoped ⇒ Criteria
Get a criteria for the embedded documents without the default scoping applied.
305 306 307 |
# File 'lib/mongoid/relations/embedded/many.rb', line 305 def unscoped criteria(false) end |