Module: Mongoid::Factory
Overview
Instantiates documents that came from the database.
Instance Method Summary collapse
-
#build(klass, attributes = nil) ⇒ Document
Builds a new
Document
from the supplied attributes. -
#execute_build(klass, attributes = nil, options = {}) ⇒ Document
private
Execute the build.
-
#execute_from_db(klass, attributes = nil, criteria = nil, selected_fields = nil, execute_callbacks: Threaded.execute_callbacks?) ⇒ Document
private
Execute from_db.
-
#from_db(klass, attributes = nil, criteria = nil, selected_fields = nil) ⇒ Document
Builds a new
Document
from the supplied attributes loaded from the database.
Instance Method Details
#build(klass, attributes = nil) ⇒ Document
Builds a new Document
from the supplied attributes.
This method either instantiates klass or a descendant of klass if the attributes include klass’ discriminator key.
If the attributes contain the discriminator key (which is _type by default) and the discriminator value does not correspond to a descendant of klass then this method would create an instance of klass.
27 28 29 30 31 32 33 34 35 |
# File 'lib/mongoid/factory.rb', line 27 def build(klass, attributes = nil) # A bug in Ruby 2.x (including 2.7.7) causes the attributes hash to be # interpreted as keyword arguments, because execute_build accepts # a keyword argument. Forcing an empty set of keyword arguments works # around the bug. Once Ruby 2.x support is dropped, this hack can be # removed. # See https://bugs.ruby-lang.org/issues/15753 execute_build(klass, attributes) end |
#execute_build(klass, attributes = nil, options = {}) ⇒ Document
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.
A Ruby 2.x bug prevents the options hash from being keyword arguments. Once we drop support for Ruby 2.x, we can reimplement the options hash as keyword arguments. See bugs.ruby-lang.org/issues/15753
Execute the build.
54 55 56 57 58 59 60 61 62 63 |
# File 'lib/mongoid/factory.rb', line 54 def execute_build(klass, attributes = nil, = {}) attributes ||= {} dvalue = attributes[klass.discriminator_key] || attributes[klass.discriminator_key.to_sym] type = klass.get_discriminator_mapping(dvalue) if type type.construct_document(attributes, ) else klass.construct_document(attributes, ) end end |
#execute_from_db(klass, attributes = nil, criteria = nil, selected_fields = nil, execute_callbacks: Threaded.execute_callbacks?) ⇒ Document
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.
Execute from_db.
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
# File 'lib/mongoid/factory.rb', line 113 def execute_from_db(klass, attributes = nil, criteria = nil, selected_fields = nil, execute_callbacks: Threaded.execute_callbacks?) if criteria selected_fields ||= criteria.[:fields] end type = (attributes || {})[klass.discriminator_key] if type.blank? obj = klass.instantiate_document(attributes, selected_fields, execute_callbacks: execute_callbacks) if criteria && criteria.association && criteria.parent_document obj.set_relation(criteria.association.inverse, criteria.parent_document) end obj else constantized = klass.get_discriminator_mapping(type) unless constantized camelized = type.camelize # Check if the class exists begin constantized = camelized.constantize rescue NameError raise Errors::UnknownModel.new(camelized, type) end end # Check if the class is a Document class if !constantized.respond_to?(:instantiate) raise Errors::UnknownModel.new(camelized, type) end constantized.instantiate_document(attributes, selected_fields, execute_callbacks: execute_callbacks) end end |
#from_db(klass, attributes = nil, criteria = nil, selected_fields = nil) ⇒ Document
Builds a new Document
from the supplied attributes loaded from the database.
If the attributes contain the discriminator key (which is _type by default) and the discriminator value does not correspond to a descendant of klass then this method raises an UnknownModel error.
If a criteria object is given, it is used in two ways:
-
If the criteria has a list of fields specified via #only, only those fields are populated in the returned document.
-
If the criteria has a referencing association (i.e., this document is being instantiated as an association of another document), the other document is also populated in the returned document’s reverse association, if one exists.
91 92 93 |
# File 'lib/mongoid/factory.rb', line 91 def from_db(klass, attributes = nil, criteria = nil, selected_fields = nil) execute_from_db(klass, attributes, criteria, selected_fields) end |