class Mongoid::Association::Proxy
This class is the superclass for all association proxy objects, and contains common behavior for all of them.
Constants
- KEEPER_METHODS
specific methods to prevent from being undefined
Attributes
Model instance for the base of the association.
For example, if a Post embeds_many Comments, _base is a particular instance of the Post model.
Model instance for one to one associations, or array of model instances for one to many associations, for the target of the association.
For example, if a Post embeds_many Comments, _target is an array of Comment models embedded in a particular Post.
Public Class Methods
Sets the target and the association metadata properties.
@param [ Document
] base The base document on the proxy. @param [ Document
| Array<Document> ] target The target of the proxy. @param [ Mongoid::Association::Relatable
] association The association metadata.
# File lib/mongoid/association/proxy.rb, line 60 def initialize(base, target, association) @_base, @_target, @_association = base, target, association yield(self) if block_given? extend_proxies(association.extension) if association.extension end
Public Instance Methods
Allow extension to be an array and extend each module
# File lib/mongoid/association/proxy.rb, line 67 def extend_proxies(*extension) extension.flatten.each { |ext| extend_proxy(ext) } end
Get the class from the association, or return nil if no association present.
@example Get the class.
proxy.klass
@return [ Class ] The association class.
# File lib/mongoid/association/proxy.rb, line 77 def klass _association&.klass end
Resets the criteria inside the association proxy. Used by many to many associations to keep the underlying ids array in sync.
@example Reset the association criteria.
person.preferences.reset_relation_criteria
# File lib/mongoid/association/proxy.rb, line 86 def reset_unloaded _target.reset_unloaded(criteria) end
The default substitutable object for an association proxy is the clone of the target.
@example Get the substitutable.
proxy.substitutable
@return [ Object
] A clone of the target.
# File lib/mongoid/association/proxy.rb, line 97 def substitutable _target end
Protected Instance Methods
Takes the supplied document and sets the association on it.
@example Set the association metadata.
proxt.characterize_one(name)
@param [ Document
] document The document to set on.
# File lib/mongoid/association/proxy.rb, line 120 def characterize_one(document) document._association = _association unless document._association end
Get the collection from the root of the hierarchy.
@example Get the collection.
relation.collection
@return [ Collection ] The root’s collection.
# File lib/mongoid/association/proxy.rb, line 109 def collection root = _base._root root.collection unless root.embedded? end
Executes a callback method
@example execute the before add callback
execute_callback(:before_add)
@param [ Symbol ] callback to be executed
# File lib/mongoid/association/proxy.rb, line 174 def execute_callback(callback, doc) _association.get_callbacks(callback).each do |c| if c.is_a? Proc c.call(_base, doc) else _base.send c, doc end end end
Execute the before and after callbacks for the given method.
@param [ Symbol ] name The name of the callbacks to execute.
@return [ Object
] The result of the given block
# File lib/mongoid/association/proxy.rb, line 189 def execute_callbacks_around(name, doc) execute_callback :"before_#{name}", doc yield.tap do execute_callback :"after_#{name}", doc end
# File lib/mongoid/association/proxy.rb, line 130 def method_missing(name, *args, &block) _target.send(name, *args, &block) end
When the base document illegally references an embedded document this error will get raised.
@example Raise the error.
relation.raise_mixed
@raise [ Errors::MixedRelations
] The error.
# File lib/mongoid/association/proxy.rb, line 151 def raise_mixed raise Errors::MixedRelations.new(_base.class, _association.klass) end
When the base is not yet saved and the user calls create or create! on the association, this error will get raised.
@example Raise the error.
relation.raise_unsaved(post)
@param [ Document
] doc The child document getting created.
@raise [ Errors::UnsavedDocument
] The error.
# File lib/mongoid/association/proxy.rb, line 164 def raise_unsaved(doc) raise Errors::UnsavedDocument.new(_base, doc) end
# File lib/mongoid/association/proxy.rb, line 140 def respond_to_missing?(name, *args) _target.respond_to?(name, *args) end