# encoding: utf-8 require "mongoid/relations/accessors" require "mongoid/relations/auto_save" require "mongoid/relations/cascading" require "mongoid/relations/constraint" require "mongoid/relations/conversions" require "mongoid/relations/counter_cache" require "mongoid/relations/cyclic" require "mongoid/relations/proxy" require "mongoid/relations/bindings" require "mongoid/relations/builders" require "mongoid/relations/many" require "mongoid/relations/one" require "mongoid/relations/options" require "mongoid/relations/polymorphic" require "mongoid/relations/targets/enumerable" require "mongoid/relations/embedded/in" require "mongoid/relations/embedded/many" require "mongoid/relations/embedded/one" require "mongoid/relations/referenced/in" require "mongoid/relations/referenced/many" require "mongoid/relations/referenced/many_to_many" require "mongoid/relations/referenced/one" require "mongoid/relations/reflections" require "mongoid/relations/synchronization" require "mongoid/relations/touchable" require "mongoid/relations/metadata" require "mongoid/relations/macros" module Mongoid # All classes and modules under the relations namespace handle the # functionality that has to do with embedded and referenced (relational) # associations. module Relations extend ActiveSupport::Concern include Accessors include AutoSave include Cascading include Cyclic include Builders include Macros include Polymorphic include Reflections include Synchronization include Touchable include CounterCache attr_accessor :__metadata alias :relation_metadata :__metadata # Determine if the document itself is embedded in another document via the # proper channels. (If it has a parent document.) # # @example Is the document embedded? # address.embedded? # # @return [ true, false ] True if the document has a parent document. # # @since 2.0.0.rc.1 def embedded? @embedded ||= (cyclic ? _parent.present? : self.class.embedded?) end # Determine if the document is part of an embeds_many relation. # # @example Is the document in an embeds many? # address.embedded_many? # # @return [ true, false ] True if in an embeds many. # # @since 2.0.0.rc.1 def embedded_many? __metadata && __metadata.macro == :embeds_many end # Determine if the document is part of an embeds_one relation. # # @example Is the document in an embeds one? # address.embedded_one? # # @return [ true, false ] True if in an embeds one. # # @since 2.0.0.rc.1 def embedded_one? __metadata && __metadata.macro == :embeds_one end # Get the metadata name for this document. If no metadata was defined # will raise an error. # # @example Get the metadata name. # document.metadata_name # # @raise [ Errors::NoMetadata ] If no metadata is present. # # @return [ Symbol ] The metadata name. # # @since 3.0.0 def metadata_name raise Errors::NoMetadata.new(self.class.name) unless __metadata __metadata.name end # Determine if the document is part of an references_many relation. # # @example Is the document in a references many? # post.referenced_many? # # @return [ true, false ] True if in a references many. # # @since 2.0.0.rc.1 def referenced_many? __metadata && __metadata.macro == :has_many end # Determine if the document is part of an references_one relation. # # @example Is the document in a references one? # address.referenced_one? # # @return [ true, false ] True if in a references one. # # @since 2.0.0.rc.1 def referenced_one? __metadata && __metadata.macro == :has_one end # Convenience method for iterating through the loaded relations and # reloading them. # # @example Reload the relations. # document.reload_relations # # @return [ Hash ] The relations metadata. # # @since 2.1.6 def reload_relations relations.each_pair do |name, meta| if instance_variable_defined?("@_#{name}") if _parent.nil? || instance_variable_get("@_#{name}") != _parent remove_instance_variable("@_#{name}") end end end end end end