Class: Mongoid::Relations::Referenced::Many
- Defined in:
- build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb
Overview
This class defines the behaviour for all relations that are a one-to-many between documents in different collections.
Direct Known Subclasses
Constant Summary collapse
- VALID_OPTIONS =
The allowed options when defining this relation.
[ :after_add, :after_remove, :as, :autosave, :before_add, :before_remove, :dependent, :foreign_key, :order, :primary_key ].freeze
Instance Attribute Summary
Attributes inherited from Proxy
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.
-
.criteria(metadata, object, type = nil) ⇒ Criteria
Get the standard criteria used for querying this relation.
- .eager_load_klass ⇒ Object
-
.embedded? ⇒ false
Returns true if the relation is an embedded one.
-
.foreign_key(name) ⇒ String
Get the foreign key for the provided name.
-
.foreign_key_default ⇒ nil
Get the default value for the foreign key.
-
.foreign_key_suffix ⇒ String
Returns the suffix of the foreign key field, either “_id” or “_ids”.
-
.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) ⇒ Root
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) ⇒ Array<Document>
(also: #push)
Appends a document or array of documents to the relation.
-
#build(attributes = {}, type = nil) {|doc| ... } ⇒ Document
(also: #new)
Build a new document from the attributes and append it to this relation without saving.
-
#concat(documents) ⇒ Array<Document>
Appends an array of documents to the relation.
-
#delete(document) ⇒ Document
Delete the document from the relation.
-
#delete_all(conditions = nil) ⇒ Integer
Deletes all related documents from the database given the supplied conditions.
-
#destroy_all(conditions = nil) ⇒ Integer
Destroys all related documents from the database given the supplied conditions.
-
#each ⇒ Array<Document>
Iterate over each document in the relation and yield to the provided block.
-
#exists? ⇒ true, false
Determine if any documents in this relation exist in the database.
-
#find(*args) ⇒ Document, Criteria
Find the matchind document on the association, either based on id or conditions.
-
#initialize(base, target, metadata) ⇒ Many
constructor
Instantiate a new references_many relation.
-
#nullify ⇒ Object
(also: #nullify_all)
Removes all associations between the base document and the target documents by deleting the foreign keys and the references, orphaning the target documents in the process.
-
#purge ⇒ Many
(also: #clear)
Clear the relation.
-
#substitute(replacement) ⇒ Many
Substitutes the supplied target documents for the existing documents in the relation.
-
#unscoped ⇒ Criteria
Get a criteria for the documents without the default scoping applied.
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, metadata) ⇒ Many
Instantiate a new references_many relation. Will set the foreign key and the base on the inverse object.
233 234 235 236 237 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 233 def initialize(base, target, ) init(base, Targets::Enumerable.new(target), ) do raise_mixed if klass. && !klass.cyclic? 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.
457 458 459 460 461 462 463 464 465 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 457 def method_missing(name, *args, &block) if target.respond_to?(name) target.send(name, *args, &block) else klass.send(:with_scope, criteria) do criteria.public_send(name, *args, &block) end 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.
592 593 594 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 592 def builder(base, , object) Builders::Referenced::Many.new(base, , object || []) end |
.criteria(metadata, object, type = nil) ⇒ Criteria
Get the standard criteria used for querying this relation.
608 609 610 611 612 613 614 615 616 617 618 619 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 608 def criteria(, object, type = nil) apply_ordering( with_inverse_field_criterion( with_polymorphic_criterion( .klass.where(.foreign_key => object), , type ), ), ) end |
.eager_load_klass ⇒ Object
621 622 623 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 621 def eager_load_klass Relations::Eager::HasMany end |
.embedded? ⇒ false
Returns true if the relation is an embedded one. In this case always false.
634 635 636 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 634 def false end |
.foreign_key(name) ⇒ String
Get the foreign key for the provided name.
648 649 650 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 648 def foreign_key(name) "#{name}#{foreign_key_suffix}" end |
.foreign_key_default ⇒ nil
Get the default value for the foreign key.
660 661 662 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 660 def foreign_key_default nil end |
.foreign_key_suffix ⇒ String
Returns the suffix of the foreign key field, either “_id” or “_ids”.
672 673 674 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 672 def foreign_key_suffix "_id" end |
.macro ⇒ Symbol
Returns the macro for this relation. Used mostly as a helper in reflection.
683 684 685 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 683 def macro :has_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.
709 710 711 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 709 def nested_builder(, attributes, ) Builders::NestedAttributes::Many.new(, attributes, ) end |
.path(document) ⇒ Root
Get the path calculator for the supplied document.
723 724 725 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 723 def path(document) Mongoid::Atomic::Paths::Root.new(document) end |
.stores_foreign_key? ⇒ false
Tells the caller if this relation is one that stores the foreign key on its own objects.
736 737 738 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 736 def stores_foreign_key? false end |
.valid_options ⇒ Array<Symbol>
Get the valid options allowed with this relation.
748 749 750 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 748 def VALID_OPTIONS end |
.validation_default ⇒ true, false
Get the default validation setting for the relation. Determines if by default a validates associated will occur.
761 762 763 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 761 def validation_default true end |
Instance Method Details
#<<(*args) ⇒ Array<Document> 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.
48 49 50 51 52 53 54 55 56 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 48 def <<(*args) docs = args.flatten return concat(docs) if docs.size > 1 if doc = docs.first append(doc) doc.save if persistable? && !_assigning? && !doc.validated? end self end |
#build(attributes = {}, options = {}, type = nil) ⇒ Document #build(attributes = {}, type = nil) ⇒ Document Also known as: new
Build a new document from the attributes and append it to this relation without saving.
99 100 101 102 103 104 105 106 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 99 def build(attributes = {}, type = nil) doc = Factory.build(type || klass, attributes) append(doc) doc.apply_post_processed_defaults yield(doc) if block_given? doc.run_callbacks(:build) { doc } doc end |
#concat(documents) ⇒ Array<Document>
Appends an array of documents to the relation. Performs a batch insert of the documents instead of persisting one at a time.
70 71 72 73 74 75 76 77 78 79 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 70 def concat(documents) docs, inserts = [], [] documents.each do |doc| next unless doc append(doc) save_or_delay(doc, docs, inserts) if persistable? end persist_delayed(docs, inserts) self end |
#delete(document) ⇒ Document
Delete the document from the relation. This will set the foreign key on the document to nil. If the dependent options on the relation are :delete or :destroy the appropriate removal will occur.
121 122 123 124 125 126 127 128 129 130 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 121 def delete(document) execute_callback :before_remove, document target.delete(document) do |doc| if doc unbind_one(doc) cascade!(doc) if !_assigning? end execute_callback :after_remove, doc end end |
#delete_all(conditions = nil) ⇒ Integer
Deletes all related documents from the database given the supplied conditions.
146 147 148 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 146 def delete_all(conditions = nil) remove_all(conditions, :delete_all) end |
#destroy_all(conditions = nil) ⇒ Integer
Destroys all related documents from the database given the supplied conditions.
164 165 166 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 164 def destroy_all(conditions = nil) remove_all(conditions, :destroy_all) end |
#each ⇒ Array<Document>
This will load the entire relation into memory.
Iterate over each document in the relation and yield to the provided block.
181 182 183 184 185 186 187 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 181 def each if block_given? target.each { |doc| yield(doc) } else to_enum end end |
#exists? ⇒ true, false
Determine if any documents in this relation exist in the database.
195 196 197 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 195 def exists? criteria.exists? end |
#find(*args) ⇒ Document, Criteria
This will keep matching documents in memory for iteration later.
Find the matchind document on the association, either based on id or conditions.
216 217 218 219 220 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 216 def find(*args) matching = criteria.find(*args) Array(matching).each { |doc| target.push(doc) } matching end |
#nullify ⇒ Object Also known as: nullify_all
Removes all associations between the base document and the target documents by deleting the foreign keys and the references, orphaning the target documents in the process.
247 248 249 250 251 252 253 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 247 def nullify criteria.update_all(foreign_key => nil) target.clear do |doc| unbind_one(doc) doc.changed_attributes.delete(foreign_key) end end |
#purge ⇒ Many Also known as: clear
Clear the relation. Will delete the documents from the db if they are already persisted.
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 265 def purge unless .destructive? nullify else after_remove_error = nil criteria.delete_all many = target.clear do |doc| execute_callback :before_remove, doc unbind_one(doc) doc.destroyed = true begin execute_callback :after_remove, doc rescue => e after_remove_error = e end end raise after_remove_error if after_remove_error many end end |
#substitute(replacement) ⇒ Many
Substitutes the supplied target documents for the existing documents in the relation. If the new target is nil, perform the necessary deletion.
299 300 301 302 303 304 305 306 307 308 309 310 311 312 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 299 def substitute(replacement) if replacement new_docs, docs = replacement.compact, [] new_ids = new_docs.map { |doc| doc._id } remove_not_in(new_ids) new_docs.each do |doc| docs.push(doc) if doc.send(foreign_key) != base._id end concat(docs) else purge end self end |
#unscoped ⇒ Criteria
Get a criteria for the documents without the default scoping applied.
323 324 325 326 327 |
# File 'build/mongoid-6.1/lib/mongoid/relations/referenced/many.rb', line 323 def unscoped klass.unscoped.where( foreign_key => Conversions.flag(base._id, ) ) end |