Class: Mongoid::Relations::Metadata
- Inherits:
-
Hash
- Object
- Hash
- Mongoid::Relations::Metadata
- Defined in:
- lib/mongoid/relations/metadata.rb
Overview
The “Grand Poobah” of information about any relation is this class. It contains everything you could ever possible want to know.
Instance Method Summary collapse
-
#as ⇒ true, false
Returns the as option of the relation.
-
#as? ⇒ true, false
Tells whether an as option exists.
-
#autobuilding? ⇒ true, false
Is the relation autobuilding if accessed via the getter and the document is new.
-
#autosave ⇒ true, false
Returns the autosave option of the relation.
-
#autosave? ⇒ true, false
Does the metadata have a autosave option?.
-
#builder(base, object) ⇒ Builder
Gets a relation builder associated with the relation this metadata is for.
-
#cascade_strategy ⇒ Object
Returns the name of the strategy used for handling dependent relations.
-
#cascading_callbacks? ⇒ true, false
Is this an embedded relations that allows callbacks to cascade down to it?.
-
#class_name ⇒ String
Returns the name of the class that this relation contains.
-
#constraint ⇒ Constraint
Get the foreign key contraint for the metadata.
-
#criteria(object, type) ⇒ Criteria
Get the criteria that is used to query for this metadata’s relation.
-
#cyclic ⇒ true, false
Returns the cyclic option of the relation.
-
#cyclic? ⇒ true, false
Does the metadata have a cyclic option?.
-
#dependent ⇒ Symbol
Returns the dependent option of the relation.
-
#dependent? ⇒ true, false
Does the metadata have a dependent option?.
-
#destructive? ⇒ true, false
Does the relation have a destructive dependent option specified.
-
#eager_load(ids) ⇒ Criteria
Get the criteria needed to eager load this relation.
-
#embedded? ⇒ true, false
Will determine if the relation is an embedded one or not.
-
#extension ⇒ Module
Returns the extension of the relation.
-
#extension? ⇒ true, false
Tells whether an extension definition exist for this relation.
-
#forced_nil_inverse? ⇒ true, false
Does this metadata have a forced nil inverse_of defined.
-
#foreign_key ⇒ String
Handles all the logic for figuring out what the foreign_key is for each relations query.
-
#foreign_key_check ⇒ String
Get the name of the method to check if the foreign key has changed.
-
#foreign_key_setter ⇒ String
Returns the name of the method used to set the foreign key on a document.
-
#index ⇒ true, false
Returns the index option of the relation.
-
#indexed? ⇒ true, false
Tells whether a foreign key index exists on the relation.
-
#initialize(properties = {}) ⇒ Metadata
constructor
Instantiate new metadata for a relation.
-
#inspect ⇒ String
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.
-
#inverse(other = nil) ⇒ Symbol
Get the name of the inverse relation if it exists.
-
#inverse_class_name ⇒ true, false
Returns the inverse_class_name option of the relation.
-
#inverse_class_name? ⇒ true, false
Returns the if the inverse class name option exists.
-
#inverse_foreign_key ⇒ String
Used for relational many to many only.
-
#inverse_klass ⇒ Class
Returns the inverse class of the proxied relation.
-
#inverse_metadata(document) ⇒ Metadata
Get the metadata for the inverse relation.
-
#inverse_of ⇒ true, false
Returns the inverse_of option of the relation.
-
#inverse_of? ⇒ true, false
Does the metadata have a inverse_of option?.
-
#inverse_of_field ⇒ String
Returns the name of the field in which to store the name of the inverse field for the polymorphic relation.
-
#inverse_of_field_setter ⇒ String
Gets the setter for the field that stores the name of the inverse field on a polymorphic relation.
-
#inverse_setter(other = nil) ⇒ String
Returns the setter for the inverse side of the relation.
-
#inverse_type ⇒ String
Returns the name of the field in which to store the name of the class for the polymorphic relation.
-
#inverse_type_setter ⇒ String
Gets the setter for the field that sets the type of document on a polymorphic relation.
-
#inverses(other = nil) ⇒ Array<Symbol>
Get the name of the inverse relations if they exists.
-
#key ⇒ String
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.
-
#klass ⇒ Class
Returns the class of the proxied relation.
-
#macro ⇒ Symbol
Returns the macro for the relation of this metadata.
-
#many? ⇒ true, false
Is this metadata representing a one to many or many to many relation?.
-
#name ⇒ Symbol
Get the name associated with this metadata.
-
#name? ⇒ true, false
Is the name defined?.
-
#nested_builder(attributes, options) ⇒ NestedBuilder
Gets a relation nested builder associated with the relation this metadata is for.
-
#options ⇒ Metadata
Returns the metadata itself.
-
#order ⇒ Criterion::Complex?
Returns default order for this association.
-
#order? ⇒ true, false
Is a default order set?.
-
#path(document) ⇒ Object
Get the path calculator for the supplied document.
-
#polymorphic? ⇒ true, false
Returns true if the relation is polymorphic.
-
#relation ⇒ Proxy
Get the relation associated with this metadata.
-
#setter ⇒ String
Gets the method name used to set this relation.
-
#store_as ⇒ String
Key where embedded document is save.
-
#touchable? ⇒ true, false
Is this relation touchable?.
-
#type ⇒ String
Returns the name of the field in which to store the name of the class for the polymorphic relation.
-
#type_setter ⇒ String
Gets the setter for the field that sets the type of document on a polymorphic relation.
-
#validate? ⇒ true, false
Are we validating this relation automatically?.
-
#versioned? ⇒ true, false
Is this relation using Mongoid’s internal versioning system?.
Constructor Details
Instance Method Details
#as ⇒ true, false
Returns the as option of the relation.
19 20 21 |
# File 'lib/mongoid/relations/metadata.rb', line 19 def as self[:as] end |
#as? ⇒ true, false
Tells whether an as option exists.
31 32 33 |
# File 'lib/mongoid/relations/metadata.rb', line 31 def as? !!as end |
#autobuilding? ⇒ true, false
Is the relation autobuilding if accessed via the getter and the document is new.
44 45 46 |
# File 'lib/mongoid/relations/metadata.rb', line 44 def autobuilding? !!self[:autobuild] end |
#autosave ⇒ true, false
Returns the autosave option of the relation.
56 57 58 |
# File 'lib/mongoid/relations/metadata.rb', line 56 def autosave self[:autosave] end |
#autosave? ⇒ true, false
Does the metadata have a autosave option?
68 69 70 |
# File 'lib/mongoid/relations/metadata.rb', line 68 def autosave? !!autosave end |
#builder(base, object) ⇒ Builder
Gets a relation builder associated with the relation this metadata is for.
84 85 86 |
# File 'lib/mongoid/relations/metadata.rb', line 84 def builder(base, object) relation.builder(base, self, object) end |
#cascade_strategy ⇒ Object
Returns the name of the strategy used for handling dependent relations.
96 97 98 99 100 |
# File 'lib/mongoid/relations/metadata.rb', line 96 def cascade_strategy if dependent? "Mongoid::Relations::Cascading::#{dependent.to_s.classify}".constantize end end |
#cascading_callbacks? ⇒ true, false
Is this an embedded relations that allows callbacks to cascade down to it?
111 112 113 |
# File 'lib/mongoid/relations/metadata.rb', line 111 def cascading_callbacks? !!self[:cascade_callbacks] end |
#class_name ⇒ String
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.
125 126 127 |
# File 'lib/mongoid/relations/metadata.rb', line 125 def class_name @class_name ||= (self[:class_name] || classify).sub(/\A::/,"") end |
#constraint ⇒ Constraint
Get the foreign key contraint for the metadata.
137 138 139 |
# File 'lib/mongoid/relations/metadata.rb', line 137 def constraint @constraint ||= Constraint.new(self) end |
#criteria(object, type) ⇒ Criteria
Get the criteria that is used to query for this metadata’s relation.
152 153 154 155 |
# File 'lib/mongoid/relations/metadata.rb', line 152 def criteria(object, type) query = relation.criteria(self, object, type) order ? query.order_by(order) : query end |
#cyclic ⇒ true, false
Returns the cyclic option of the relation.
165 166 167 |
# File 'lib/mongoid/relations/metadata.rb', line 165 def cyclic self[:cyclic] end |
#cyclic? ⇒ true, false
Does the metadata have a cyclic option?
177 178 179 |
# File 'lib/mongoid/relations/metadata.rb', line 177 def cyclic? !!cyclic end |
#dependent ⇒ Symbol
Returns the dependent option of the relation.
189 190 191 |
# File 'lib/mongoid/relations/metadata.rb', line 189 def dependent self[:dependent] end |
#dependent? ⇒ true, false
Does the metadata have a dependent option?
201 202 203 |
# File 'lib/mongoid/relations/metadata.rb', line 201 def dependent? !!dependent end |
#destructive? ⇒ true, false
Does the relation have a destructive dependent option specified. This is true for :dependent => :delete and :dependent => :destroy.
652 653 654 |
# File 'lib/mongoid/relations/metadata.rb', line 652 def destructive? @destructive ||= (dependent == :delete || dependent == :destroy) end |
#eager_load(ids) ⇒ Criteria
Get the criteria needed to eager load this relation.
215 216 217 |
# File 'lib/mongoid/relations/metadata.rb', line 215 def eager_load(ids) relation.eager_load(self, ids) end |
#embedded? ⇒ true, false
Will determine if the relation is an embedded one or not. Currently only checks against embeds one and many.
228 229 230 |
# File 'lib/mongoid/relations/metadata.rb', line 228 def @embedded ||= (macro == :embeds_one || macro == :embeds_many) end |
#extension ⇒ Module
Returns the extension of the relation.
240 241 242 |
# File 'lib/mongoid/relations/metadata.rb', line 240 def extension self[:extend] end |
#extension? ⇒ true, false
Tells whether an extension definition exist for this relation.
252 253 254 |
# File 'lib/mongoid/relations/metadata.rb', line 252 def extension? !!extension end |
#forced_nil_inverse? ⇒ true, false
Does this metadata have a forced nil inverse_of defined. (Used in many to manies)
265 266 267 |
# File 'lib/mongoid/relations/metadata.rb', line 265 def forced_nil_inverse? @forced_nil_inverse ||= has_key?(:inverse_of) && inverse_of.nil? end |
#foreign_key ⇒ String
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.
284 285 286 |
# File 'lib/mongoid/relations/metadata.rb', line 284 def foreign_key @foreign_key ||= determine_foreign_key end |
#foreign_key_check ⇒ String
Get the name of the method to check if the foreign key has changed.
296 297 298 |
# File 'lib/mongoid/relations/metadata.rb', line 296 def foreign_key_check @foreign_key_check ||= "#{foreign_key}_changed?" end |
#foreign_key_setter ⇒ String
Returns the name of the method used to set the foreign key on a document.
309 310 311 |
# File 'lib/mongoid/relations/metadata.rb', line 309 def foreign_key_setter @foreign_key_setter ||= "#{foreign_key}=" end |
#index ⇒ true, false
Returns the index option of the relation.
321 322 323 |
# File 'lib/mongoid/relations/metadata.rb', line 321 def index self[:index] end |
#indexed? ⇒ true, false
Tells whether a foreign key index exists on the relation.
333 334 335 |
# File 'lib/mongoid/relations/metadata.rb', line 333 def indexed? !!index end |
#inspect ⇒ String
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.
360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 |
# File 'lib/mongoid/relations/metadata.rb', line 360 def inspect ::I18n.translate( "mongoid.inspection.metadata", { autobuild: autobuilding?, class_name: class_name, cyclic: cyclic.inspect, dependent: dependent.inspect, inverse_of: inverse_of.inspect, key: key, locale: :en, macro: macro, name: name, order: order.inspect, polymorphic: polymorphic?, relation: relation, setter: setter, versioned: versioned? } ) end |
#inverse(other = nil) ⇒ Symbol
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.
410 411 412 413 |
# File 'lib/mongoid/relations/metadata.rb', line 410 def inverse(other = nil) invs = inverses(other) invs.first if invs.count == 1 end |
#inverse_class_name ⇒ true, false
Returns the inverse_class_name option of the relation.
423 424 425 |
# File 'lib/mongoid/relations/metadata.rb', line 423 def inverse_class_name self[:inverse_class_name] end |
#inverse_class_name? ⇒ true, false
Returns the if the inverse class name option exists.
435 436 437 |
# File 'lib/mongoid/relations/metadata.rb', line 435 def inverse_class_name? !!inverse_class_name end |
#inverse_foreign_key ⇒ String
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.
449 450 451 |
# File 'lib/mongoid/relations/metadata.rb', line 449 def inverse_foreign_key @inverse_foreign_key ||= determine_inverse_foreign_key end |
#inverse_klass ⇒ Class
Returns the inverse class of the proxied relation.
461 462 463 |
# File 'lib/mongoid/relations/metadata.rb', line 461 def inverse_klass @inverse_klass ||= inverse_class_name.constantize end |
#inverse_metadata(document) ⇒ Metadata
Get the metadata for the inverse relation.
475 476 477 |
# File 'lib/mongoid/relations/metadata.rb', line 475 def (document) document.reflect_on_association(inverse(document)) end |
#inverse_of ⇒ true, false
Returns the inverse_of option of the relation.
487 488 489 |
# File 'lib/mongoid/relations/metadata.rb', line 487 def inverse_of self[:inverse_of] end |
#inverse_of? ⇒ true, false
Does the metadata have a inverse_of option?
499 500 501 |
# File 'lib/mongoid/relations/metadata.rb', line 499 def inverse_of? !!inverse_of end |
#inverse_of_field ⇒ String
Returns the name of the field in which to store the name of the inverse field for the polymorphic relation.
554 555 556 |
# File 'lib/mongoid/relations/metadata.rb', line 554 def inverse_of_field @inverse_of_field ||= determine_inverse_for(:field) end |
#inverse_of_field_setter ⇒ String
Gets the setter for the field that stores the name of the inverse field on a polymorphic relation.
565 566 567 |
# File 'lib/mongoid/relations/metadata.rb', line 565 def inverse_of_field_setter @inverse_of_field_setter ||= inverse_of_field ? "#{inverse_of_field}=" : nil end |
#inverse_setter(other = nil) ⇒ String
Returns the setter for the inverse side of the relation.
513 514 515 516 |
# File 'lib/mongoid/relations/metadata.rb', line 513 def inverse_setter(other = nil) inv = inverse(other) inv ? "#{inv}=" : nil end |
#inverse_type ⇒ String
Returns the name of the field in which to store the name of the class for the polymorphic relation.
527 528 529 |
# File 'lib/mongoid/relations/metadata.rb', line 527 def inverse_type @inverse_type ||= determine_inverse_for(:type) end |
#inverse_type_setter ⇒ String
Gets the setter for the field that sets the type of document on a polymorphic relation.
540 541 542 |
# File 'lib/mongoid/relations/metadata.rb', line 540 def inverse_type_setter @inverse_type_setter ||= inverse_type ? "#{inverse_type}=" : nil end |
#inverses(other = nil) ⇒ Array<Symbol>
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.
391 392 393 394 395 396 397 |
# File 'lib/mongoid/relations/metadata.rb', line 391 def inverses(other = nil) if self[:polymorphic] lookup_inverses(other) else @inverses ||= determine_inverses end end |
#key ⇒ String
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.
579 580 581 |
# File 'lib/mongoid/relations/metadata.rb', line 579 def key @key ||= determine_key end |
#klass ⇒ Class
Returns the class of the proxied relation.
591 592 593 |
# File 'lib/mongoid/relations/metadata.rb', line 591 def klass @klass ||= class_name.constantize end |
#macro ⇒ Symbol
Returns the macro for the relation of this metadata.
615 616 617 |
# File 'lib/mongoid/relations/metadata.rb', line 615 def macro relation.macro end |
#many? ⇒ true, false
Is this metadata representing a one to many or many to many relation?
603 604 605 |
# File 'lib/mongoid/relations/metadata.rb', line 603 def many? @many ||= (relation.macro.to_s =~ /many/) end |
#name ⇒ Symbol
Get the name associated with this metadata.
627 628 629 |
# File 'lib/mongoid/relations/metadata.rb', line 627 def name self[:name] end |
#name? ⇒ true, false
Is the name defined?
639 640 641 |
# File 'lib/mongoid/relations/metadata.rb', line 639 def name? !!name end |
#nested_builder(attributes, options) ⇒ NestedBuilder
Gets a relation nested builder associated with the relation this metadata is for. Nested builders are used in conjunction with nested attributes.
668 669 670 |
# File 'lib/mongoid/relations/metadata.rb', line 668 def nested_builder(attributes, ) relation.nested_builder(self, attributes, ) end |
#options ⇒ Metadata
Returns the metadata itself. Here for compatibility with Rails association metadata.
797 798 799 |
# File 'lib/mongoid/relations/metadata.rb', line 797 def self end |
#order ⇒ Criterion::Complex?
Returns default order for this association.
809 810 811 |
# File 'lib/mongoid/relations/metadata.rb', line 809 def order self[:order] end |
#order? ⇒ true, false
Is a default order set?
821 822 823 |
# File 'lib/mongoid/relations/metadata.rb', line 821 def order? !!order end |
#path(document) ⇒ Object
Get the path calculator for the supplied document.
682 683 684 |
# File 'lib/mongoid/relations/metadata.rb', line 682 def path(document) relation.path(document) end |
#polymorphic? ⇒ true, false
Returns true if the relation is polymorphic.
694 695 696 |
# File 'lib/mongoid/relations/metadata.rb', line 694 def polymorphic? @polymorphic ||= (!!self[:as] || !!self[:polymorphic]) end |
#relation ⇒ Proxy
Get the relation associated with this metadata.
706 707 708 |
# File 'lib/mongoid/relations/metadata.rb', line 706 def relation self[:relation] end |
#setter ⇒ String
Gets the method name used to set this relation.
719 720 721 |
# File 'lib/mongoid/relations/metadata.rb', line 719 def setter @setter ||= "#{name.to_s}=" end |
#store_as ⇒ String
Key where embedded document is save. By default is the name of relation
756 757 758 |
# File 'lib/mongoid/relations/metadata.rb', line 756 def store_as @store_as ||= (self[:store_as].try(:to_s) || name.to_s) end |
#touchable? ⇒ true, false
Is this relation touchable?
833 834 835 |
# File 'lib/mongoid/relations/metadata.rb', line 833 def touchable? !!self[:touch] end |
#type ⇒ String
Returns the name of the field in which to store the name of the class for the polymorphic relation.
732 733 734 |
# File 'lib/mongoid/relations/metadata.rb', line 732 def type @type ||= polymorphic? ? "#{as.to_s}_type" : nil end |
#type_setter ⇒ String
Gets the setter for the field that sets the type of document on a polymorphic relation.
745 746 747 |
# File 'lib/mongoid/relations/metadata.rb', line 745 def type_setter @type_setter ||= type ? "#{type}=" : nil end |
#validate? ⇒ true, false
Are we validating this relation automatically?
768 769 770 771 772 773 774 |
# File 'lib/mongoid/relations/metadata.rb', line 768 def validate? unless self[:validate].nil? self[:validate] else self[:validate] = relation.validation_default end end |
#versioned? ⇒ true, false
Is this relation using Mongoid’s internal versioning system?
784 785 786 |
# File 'lib/mongoid/relations/metadata.rb', line 784 def versioned? !!self[:versioned] end |