Class: Mongoid::Relations::Referenced::Many
- Includes:
- Batch
- Defined in:
- 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
Instance Attribute Summary
Attributes inherited from Proxy
#base, #loaded, #metadata, #target
Class Method Summary collapse
-
.builder(meta, object) ⇒ Builder
Return the builder that is responsible for generating the documents that will be used by this relation.
-
.embedded? ⇒ false
Returns true if the relation is an embedded one.
-
.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.
-
.stores_foreign_key? ⇒ false
Tells the caller if this relation is one that stores the foreign key on its own objects.
Instance Method Summary collapse
-
#<<(*args) ⇒ Object
(also: #concat, #push)
Appends a document or array of documents to the relation.
-
#bind(options = {}) ⇒ Object
Binds the base object to the inverse of the relation.
-
#clear(options = {}) ⇒ 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 = nil, type = nil, &block) ⇒ Document
Creates a new document on the references many relation.
-
#create!(attributes = nil, type = nil, &block) ⇒ Document
Creates a new document on the references many 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.
-
#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.
-
#load!(options = {}) ⇒ Many
Will load the target into an array if the target had not already been loaded.
-
#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.
-
#substitute(target, options = {}) ⇒ Many
Substitutes the supplied target documents for the existing documents in the relation.
-
#unbind(options = {}) ⇒ Object
Unbinds the base object to the inverse of the relation.
Methods inherited from Many
#build, #exists?, #find_or_create_by, #find_or_initialize_by, #nil?, #respond_to?, #serializable_hash, #size
Methods inherited from Proxy
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.
202 203 204 |
# File 'lib/mongoid/relations/referenced/many.rb', line 202 def initialize(base, target, ) init(base, target, ) 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.
399 400 401 402 403 404 405 |
# File 'lib/mongoid/relations/referenced/many.rb', line 399 def method_missing(name, *args, &block) load!(:binding => true) and return super if [].respond_to?(name) klass = .klass klass.send(:with_scope, criteria) do criteria.send(name, *args, &block) end end |
Class Method Details
.builder(meta, object) ⇒ Builder
Return the builder that is responsible for generating the documents that will be used by this relation.
422 423 424 |
# File 'lib/mongoid/relations/referenced/many.rb', line 422 def builder(, object) Builders::Referenced::Many.new(, object || []) end |
.embedded? ⇒ false
Returns true if the relation is an embedded one. In this case always false.
435 436 437 |
# File 'lib/mongoid/relations/referenced/many.rb', line 435 def false end |
.foreign_key_default ⇒ nil
Get the default value for the foreign key.
447 448 449 |
# File 'lib/mongoid/relations/referenced/many.rb', line 447 def foreign_key_default nil end |
.foreign_key_suffix ⇒ String
Returns the suffix of the foreign key field, either “_id” or “_ids”.
459 460 461 |
# File 'lib/mongoid/relations/referenced/many.rb', line 459 def foreign_key_suffix "_id" end |
.macro ⇒ Symbol
Returns the macro for this relation. Used mostly as a helper in reflection.
470 471 472 |
# File 'lib/mongoid/relations/referenced/many.rb', line 470 def macro :references_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.
496 497 498 |
# File 'lib/mongoid/relations/referenced/many.rb', line 496 def nested_builder(, attributes, ) Builders::NestedAttributes::Many.new(, attributes, ) end |
.stores_foreign_key? ⇒ false
Tells the caller if this relation is one that stores the foreign key on its own objects.
509 510 511 |
# File 'lib/mongoid/relations/referenced/many.rb', line 509 def stores_foreign_key? false 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 33 |
# File 'lib/mongoid/relations/referenced/many.rb', line 24 def <<(*args) = (args) batched do args.flatten.each do |doc| return doc unless doc append(doc, ) doc.save if base.persisted? && ![:binding] end end end |
#bind(options = {}) ⇒ Object
Binds the base object to the inverse of the relation. This is so we are referenced to the actual objects themselves and dont hit the database twice when setting the relations up.
This is called after first creating the relation, or if a new object is set on the relation.
54 55 56 57 |
# File 'lib/mongoid/relations/referenced/many.rb', line 54 def bind( = {}) binding.bind() target.map(&:save) if base.persisted? && ![:binding] end |
#clear(options = {}) ⇒ Many
Clear the relation. Will delete the documents from the db if they are already persisted.
69 70 71 72 73 74 |
# File 'lib/mongoid/relations/referenced/many.rb', line 69 def clear( = {}) load! and tap do |relation| relation.unbind(()) target.clear 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 in memory.
85 86 87 |
# File 'lib/mongoid/relations/referenced/many.rb', line 85 def count criteria.count end |
#create(attributes = nil, type = nil, &block) ⇒ Document
Creates a new document on the references many relation. This will save the document if the parent has been persisted.
99 100 101 102 103 |
# File 'lib/mongoid/relations/referenced/many.rb', line 99 def create(attributes = nil, type = nil, &block) build(attributes, type, &block).tap do |doc| base.persisted? ? doc.save : raise_unsaved(doc) end end |
#create!(attributes = nil, type = nil, &block) ⇒ Document
Creates a new document on the references many relation. This will save the document if the parent has been persisted and will raise an error if validation fails.
118 119 120 121 122 |
# File 'lib/mongoid/relations/referenced/many.rb', line 118 def create!(attributes = nil, type = nil, &block) build(attributes, type, &block).tap do |doc| base.persisted? ? doc.save! : raise_unsaved(doc) end end |
#delete_all(conditions = nil) ⇒ Integer
Deletes all related documents from the database given the supplied conditions.
136 137 138 139 140 141 142 143 |
# File 'lib/mongoid/relations/referenced/many.rb', line 136 def delete_all(conditions = nil) raise_mixed if klass. selector = (conditions || {})[:conditions] || {} target.delete_if { |doc| doc.matches?(selector) } .klass.delete_all( :conditions => criteria.selector.merge(selector) ) end |
#destroy_all(conditions = nil) ⇒ Integer
Destroys all related documents from the database given the supplied conditions.
157 158 159 160 161 162 163 164 |
# File 'lib/mongoid/relations/referenced/many.rb', line 157 def destroy_all(conditions = nil) raise_mixed if klass. selector = (conditions || {})[:conditions] || {} target.delete_if { |doc| doc.matches?(selector) } .klass.destroy_all( :conditions => criteria.selector.merge(selector) ) end |
#find(*args) ⇒ Document, Criteria
Find the matchind document on the association, either based on id or conditions.
189 190 191 |
# File 'lib/mongoid/relations/referenced/many.rb', line 189 def find(*args) criteria.find(*args) end |
#load!(options = {}) ⇒ Many
Will load the target into an array if the target had not already been loaded.
215 216 217 218 219 220 221 222 223 224 |
# File 'lib/mongoid/relations/referenced/many.rb', line 215 def load!( = {}) raise_mixed if klass. tap do |relation| unless relation.loaded? relation.target = target.entries relation.bind() relation.loaded = true end end 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.
234 235 236 |
# File 'lib/mongoid/relations/referenced/many.rb', line 234 def nullify clear(:binding => true, :continue => true, :nullify => true) end |
#substitute(target, options = {}) ⇒ Many
Substitutes the supplied target documents for the existing documents in the relation. If the new target is nil, perform the necessary deletion.
256 257 258 |
# File 'lib/mongoid/relations/referenced/many.rb', line 256 def substitute(target, = {}) tap { target ? (@target = target.to_a; bind()) : (@target = unbind()) } end |
#unbind(options = {}) ⇒ Object
Unbinds the base object to the inverse of the relation. This occurs when setting a side of the relation to nil.
Will delete the object if necessary.
275 276 277 278 279 280 281 282 |
# File 'lib/mongoid/relations/referenced/many.rb', line 275 def unbind( = {}) binding.unbind() unless base.new_record? target.each(&:delete) unless [:binding] target.each(&:save) if [:nullify] end [] end |