# File lib/mongoid/relations/metadata.rb, line 743 def primary_key @primary_key ||= (self[:primary_key] || "_id").to_s end
The "Grand Poobah" of information about any relation is this class. It contains everything you could ever possible want to know.
Instantiate new metadata for a relation.
@example Create the new metadata.
Metadata.new(:name => :addresses)
@param [ Hash ] properties The relation options.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 371 def initialize(properties = {}) Options.validate!(properties) merge!(properties) end
Returns the as option of the relation.
@example Get the as option.
metadata.as
@return [ true, false ] The as option.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 18 def as self[:as] end
Tells whether an as option exists.
@example Is the as option set?
metadata.as?
@return [ true, false ] True if an as exists, false if not.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 30 def as? !!as end
Is the relation autobuilding if accessed via the getter and the document is new.
@example Is the relation autobuilding?
metadata.autobuilding?
@return [ true, false ] If the relation autobuilds.
@since 3.0.0
# File lib/mongoid/relations/metadata.rb, line 43 def autobuilding? !!self[:autobuild] end
Returns the autosave option of the relation.
@example Get the autosave option.
metadata.autosave
@return [ true, false ] The autosave option.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 55 def autosave self[:autosave] end
Does the metadata have a autosave option?
@example Is the relation autosaving?
metadata.autosave?
@return [ true, false ] If the relation autosaves.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 67 def autosave? !!autosave end
Gets a relation builder associated with the relation this metadata is for.
@example Get the builder.
metadata.builder(document)
@param [ Document ] base The base document. @param [ Object ] object A document or attributes to give the builder.
@return [ Builder ] The builder for the relation.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 83 def builder(base, object) relation.builder(base, self, object) end
Returns the name of the strategy used for handling dependent relations.
@example Get the strategy.
metadata.cascade_strategy
@return [ Object ] The cascading strategy to use.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 95 def cascade_strategy if dependent? "Mongoid::Relations::Cascading::#{dependent.to_s.classify}".constantize end end
Is this an embedded relations that allows callbacks to cascade down to it?
@example Does the relation have cascading callbacks?
metadata.cascading_callbacks?
@return [ true, false ] If the relation cascades callbacks.
@since 2.3.0
# File lib/mongoid/relations/metadata.rb, line 110 def cascading_callbacks? !!self[:cascade_callbacks] end
Returns the name of the class that this relation contains. If the #class_name was provided as an option this will return that, otherwise it will determine the name from the name property.
@example Get the class name.
metadata.class_name
@return [ String ] The name of the relation's proxied class.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 124 def class_name @class_name ||= (self[:class_name] || classify).sub(%r\A::/,"") end
Get the foreign key contraint for the metadata.
@example Get the constaint.
metadata.constraint
@return [ Constraint ] The constraint.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 136 def constraint @constraint ||= Constraint.new(self) end
Returns the counter cache column name
@example Get the counter cache column.
metadata.counter_cache_column_name
@return [ String ] The counter cache column
@since 3.1.0
# File lib/mongoid/relations/metadata.rb, line 160 def counter_cache_column_name if self[:counter_cache] == true "#{inverse_class_name.demodulize.underscore.pluralize}_count" else self[:counter_cache].to_s end end
Does the metadata have a counter cache?
@example Is the metadata counter_cached?
metadata.counter_cached?
@return [ true, false ] If the metadata has counter_cache
@since 3.1.0
# File lib/mongoid/relations/metadata.rb, line 148 def counter_cached? !!self[:counter_cache] end
Get the criteria that is used to query for this metadata's relation.
@example Get the criteria.
metadata.criteria([ id_one, id_two ], Person)
@param [ Object ] object The foreign key used for the query. @param [ Class ] type The base class.
@return [ Criteria ] The criteria.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 179 def criteria(object, type) relation.criteria(self, object, type) end
Returns the cyclic option of the relation.
@example Get the cyclic option.
metadata.cyclic
@return [ true, false ] The cyclic option.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 191 def cyclic self[:cyclic] end
Does the metadata have a cyclic option?
@example Is the metadata cyclic?
metadata.cyclic?
@return [ true, false ] If the metadata is cyclic.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 203 def cyclic? !!cyclic end
Returns the dependent option of the relation.
@example Get the dependent option.
metadata.dependent
@return [ Symbol ] The dependent option.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 215 def dependent self[:dependent] end
Does the metadata have a dependent option?
@example Is the metadata performing cascades?
metadata.dependent?
@return [ true, false ] If the metadata cascades.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 227 def dependent? !!dependent end
Does the relation have a destructive dependent option specified. This is true for :dependent => :delete and :dependent => :destroy.
@example Is the relation destructive?
metadata.destructive?
@return [ true, false ] If the relation is destructive.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 689 def destructive? @destructive ||= (dependent == :delete || dependent == :destroy) end
Get the criteria needed to eager load this relation.
@example Get the eager loading criteria.
metadata.eager_load(criteria)
@param [ Array<Object> ] ids The ids of the returned parents.
@return [ Criteria ] The eager loading criteria.
@since 2.2.0
# File lib/mongoid/relations/metadata.rb, line 241 def eager_load(ids) relation.eager_load(self, ids) end
Will determine if the relation is an embedded one or not. Currently only checks against embeds one and many.
@example Is the document embedded.
metadata.embedded?
@return [ true, false ] True if embedded, false if not.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 254 def embedded? @embedded ||= (macro == :embeds_one || macro == :embeds_many) end
Returns the extension of the relation.
@example Get the relation extension.
metadata.extension
@return [ Module ] The extension or nil.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 266 def extension self[:extend] end
Tells whether an extension definition exist for this relation.
@example Is an extension defined?
metadata.extension?
@return [ true, false ] True if an extension exists, false if not.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 278 def extension? !!extension end
Does this metadata have a forced nil #inverse_of defined. (Used in many to manies)
@example Is this a forced nil inverse?
metadata.forced_nil_inverse?
@return [ true, false ] If #inverse_of has been explicitly set to nil.
@since 2.3.3
# File lib/mongoid/relations/metadata.rb, line 291 def forced_nil_inverse? @forced_nil_inverse ||= has_key?(:inverse_of) && inverse_of.nil? end
Handles all the logic for figuring out what the #foreign_key is for each relations query. The logic is as follows:
If the developer defined a custom key, use that.
If the relation stores a foreign key, use the class_name_id strategy.
If the relation does not store the key, use the inverse_class_name_id strategy.
@example Get the foreign key.
metadata.foreign_key
@return [ String ] The foreign key for the relation.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 310 def foreign_key @foreign_key ||= determine_foreign_key end
Get the name of the method to check if the foreign key has changed.
@example Get the foreign key check method.
metadata.foreign_key_check
@return [ String ] The foreign key check.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 322 def foreign_key_check @foreign_key_check ||= "#{foreign_key}_changed?" end
Returns the name of the method used to set the foreign key on a document.
@example Get the setter for the foreign key.
metadata.foreign_key_setter
@return [ String ] The #foreign_key plus =.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 335 def foreign_key_setter @foreign_key_setter ||= "#{foreign_key}=" end
Returns the index option of the relation.
@example Get the index option.
metadata.index
@return [ true, false ] The index option.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 347 def index self[:index] end
Tells whether a foreign key index exists on the relation.
@example Is the key indexed?
metadata.indexed?
@return [ true, false ] True if an index exists, false if not.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 359 def indexed? !!index end
Since a lot of the information from the metadata is inferred and not explicitly stored in the hash, the inspection needs to be much more detailed.
@example Inspect the metadata.
metadata.inspect
@return [ String ] Oodles of information in a nice format.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 386 def inspect %Q{#<Mongoid::Relations::Metadata autobuild: #{autobuilding?} class_name: #{class_name} cyclic: #{cyclic.inspect} counter_cache:#{counter_cached?} dependent: #{dependent.inspect} inverse_of: #{inverse_of.inspect} key: #{key} macro: #{macro} name: #{name} order: #{order.inspect} polymorphic: #{polymorphic?} relation: #{relation} setter: #{setter} versioned: #{versioned?}> } end
Get the name of the inverse relation if it exists. If this is a polymorphic relation then just return the :as option that was defined.
@example Get the name of the inverse.
metadata.inverse
@param [ Document ] other The document to aid in the discovery.
@return [ Symbol ] The inverse name.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 433 def inverse(other = nil) invs = inverses(other) invs.first if invs.count == 1 end
Returns the #inverse_class_name option of the relation.
@example Get the #inverse_class_name option.
metadata.inverse_class_name
@return [ true, false ] The #inverse_class_name option.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 446 def inverse_class_name self[:inverse_class_name] end
Returns the if the inverse class name option exists.
@example Is an inverse class name defined?
metadata.inverse_class_name?
@return [ true, false ] If the inverse if defined.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 458 def inverse_class_name? !!inverse_class_name end
Is the inverse field bindable? Ie, do we have more than one definition on the parent class with the same polymorphic name (as).
@example Is the inverse of bindable?
metadata.inverse_of_bindable?
@return [ true, false ] If the relation needs the inverse of field set.
@since 3.0.6
# File lib/mongoid/relations/metadata.rb, line 471 def inverse_field_bindable? @inverse_field_bindable ||= (inverse_klass.relations.values.count do |meta| meta.as == as end > 1) end
Used for relational many to many only. This determines the name of the foreign key field on the inverse side of the relation, since in this case there are keys on both sides.
@example Find the inverse foreign key
metadata.inverse_foreign_key
@return [ String ] The foreign key on the inverse.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 487 def inverse_foreign_key @inverse_foreign_key ||= determine_inverse_foreign_key end
Returns the inverse class of the proxied relation.
@example Get the inverse class.
metadata.inverse_klass
@return [ Class ] The class of the inverse of the relation.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 499 def inverse_klass @inverse_klass ||= inverse_class_name.constantize end
Get the metadata for the inverse relation.
@example Get the inverse metadata.
metadata.inverse_metadata(doc)
@param [ Document, Class ] object The document or class.
@return [ Metadata ] The inverse metadata.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 513 def inverse_metadata(object) object.reflect_on_association(inverse(object)) end
Returns the #inverse_of option of the relation.
@example Get the #inverse_of option.
metadata.inverse_of
@return [ true, false ] The #inverse_of option.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 525 def inverse_of self[:inverse_of] end
Does the metadata have a #inverse_of option?
@example Is an #inverse_of defined?
metadata.inverse_of?
@return [ true, false ] If the relation has an #inverse_of defined.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 537 def inverse_of? !!inverse_of end
Returns the name of the field in which to store the name of the inverse field for the polymorphic relation.
@example Get the name of the field.
metadata.inverse_of_field
@return [ String ] The name of the field for storing the name of the
inverse field.
@since 2.4.5
# File lib/mongoid/relations/metadata.rb, line 591 def inverse_of_field @inverse_of_field ||= determine_inverse_for(:field) end
Gets the setter for the field that stores the name of the inverse field on a polymorphic relation.
@example Get the inverse type setter.
metadata.inverse_of_field_setter
@return [ String ] The name of the setter.
# File lib/mongoid/relations/metadata.rb, line 602 def inverse_of_field_setter @inverse_of_field_setter ||= inverse_of_field.__setter__ end
Returns the setter for the inverse side of the relation.
@example Get the inverse setter.
metadata.inverse_setter
@param [ Document ] other A document to aid in the discovery.
@return [ String ] The inverse setter name.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 551 def inverse_setter(other = nil) inverse(other).__setter__ end
Returns the name of the field in which to store the name of the class for the polymorphic relation.
@example Get the name of the field.
metadata.inverse_type
@return [ String ] The name of the field for storing the type.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 564 def inverse_type @inverse_type ||= determine_inverse_for(:type) end
Gets the setter for the field that sets the type of document on a polymorphic relation.
@example Get the inverse type setter.
metadata.inverse_type_setter
@return [ String ] The name of the setter.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 577 def inverse_type_setter @inverse_type_setter ||= inverse_type.__setter__ end
Get the name of the inverse relations if they exists. If this is a polymorphic relation then just return the :as option that was defined.
@example Get the names of the inverses.
metadata.inverses
@param [ Document ] other The document to aid in the discovery.
@return [ Array<Symbol> ] The inverse name.
# File lib/mongoid/relations/metadata.rb, line 414 def inverses(other = nil) if self[:polymorphic] lookup_inverses(other) else @inverses ||= determine_inverses end end
This returns the key that is to be used to grab the attributes for the relation or the foreign key or id that a referenced relation will use to query for the object.
@example Get the lookup key.
metadata.key
@return [ String ] The association name, foreign key name, or _id.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 616 def key @key ||= determine_key end
Returns the class of the proxied relation.
@example Get the class.
metadata.klass
@return [ Class ] The class of the relation.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 628 def klass @klass ||= class_name.constantize end
Returns the macro for the relation of this metadata.
@example Get the macro.
metadata.macro
@return [ Symbol ] The macro.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 652 def macro relation.macro end
Is this metadata representing a one to many or many to many relation?
@example Is the relation a many?
metadata.many?
@return [ true, false ] If the relation is a many.
@since 2.1.6
# File lib/mongoid/relations/metadata.rb, line 640 def many? @many ||= (relation.macro.to_s =~ %rmany/) end
Get the name associated with this metadata.
@example Get the name.
metadata.name
@return [ Symbol ] The name.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 664 def name self[:name] end
Is the name defined?
@example Is the name defined?
metadata.name?
@return [ true, false ] If the name is defined.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 676 def name? !!name end
Gets a relation nested builder associated with the relation this metadata is for. Nested builders are used in conjunction with nested attributes.
@example Get the nested builder.
metadata.nested_builder(attributes, options)
@param [ Hash ] attributes The attributes to build the relation with. @param [ Hash ] options Options for the nested builder.
@return [ NestedBuilder ] The nested builder for the relation.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 705 def nested_builder(attributes, options) relation.nested_builder(self, attributes, options) end
Returns default order for this association.
@example Get default order
metadata.order
@return [ Criterion::Complex, nil] nil if doesn't set
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 858 def order self[:order] end
Is a default order set?
@example Is the order set?
metadata.order?
@return [ true, false ] If the order is set.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 870 def order? !!order end
Get the path calculator for the supplied document.
@example Get the path calculator.
metadata.path(document)
@param [ Document ] document The document to calculate on.
@return [ Object ] The atomic path calculator.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 719 def path(document) relation.path(document) end
Returns true if the relation is polymorphic.
@example Is the relation polymorphic?
metadata.polymorphic?
@return [ true, false ] True if the relation is polymorphic, false if not.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 731 def polymorphic? @polymorphic ||= (!!self[:as] || !!self[:polymorphic]) end
Get the primary key field for finding the related document.
@example Get the primary key.
metadata.primary_key
@return [ String ] The primary key field.
@since 3.1.0
# File lib/mongoid/relations/metadata.rb, line 743 def primary_key @primary_key ||= (self[:primary_key] || "_id").to_s end
Get the relation associated with this metadata.
@example Get the relation.
metadata.relation
@return [ Proxy ] The relation proxy class.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 755 def relation self[:relation] end
Gets the method name used to set this relation.
@example Get the setter.
metadata = Metadata.new(:name => :person) metadata.setter # => "person="
@return [ String ] The name plus "=".
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 768 def setter @setter ||= "#{name}=" end
Key where embedded document is save. By default is the name of relation
@return [ String ] the name of key where save
@since 3.0.0
# File lib/mongoid/relations/metadata.rb, line 805 def store_as @store_as ||= (self[:store_as].try(:to_s) || name.to_s) end
Is this relation touchable?
@example Is the relation touchable?
metadata.touchable?
@return [ true, false ] If the relation can be touched.
@since 3.0.0
# File lib/mongoid/relations/metadata.rb, line 882 def touchable? !!self[:touch] end
Returns the name of the field in which to store the name of the class for the polymorphic relation.
@example Get the name of the field.
metadata.inverse_type
@return [ String ] The name of the field for storing the type.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 781 def type @type ||= polymorphic? ? "#{as}_type" : nil end
Returns the metadata class types.
@example Get the relation class types.
metadata.type_relation
@return [ Hash ] The hash with relation class types.
@since 3.1.0
# File lib/mongoid/relations/metadata.rb, line 894 def type_relation { _type: { "$in" => klass._types }} end
Gets the setter for the field that sets the type of document on a polymorphic relation.
@example Get the inverse type setter.
metadata.inverse_type_setter
@return [ String ] The name of the setter.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 794 def type_setter @type_setter ||= type.__setter__ end
Are we validating this relation automatically?
@example Is automatic validation on?
metadata.validate?
@return [ true, false ] True unless explictly set to false.
@since 2.0.0.rc.1
# File lib/mongoid/relations/metadata.rb, line 817 def validate? unless self[:validate].nil? self[:validate] else self[:validate] = relation.validation_default end end
Is this relation using Mongoid's internal versioning system?
@example Is this relation versioned?
metadata.versioned?
@return [ true, false ] If the relation uses Mongoid versioning.
@since 2.1.0
# File lib/mongoid/relations/metadata.rb, line 833 def versioned? !!self[:versioned] end