module Mongoid::Relations::Accessors

This module contains all the behaviour related to accessing relations through the getters and setters, and how to delegate to builders to create new ones.

Public Instance Methods

__build__(name, object, metadata) click to toggle source

Builds the related document and creates the relation unless the document is nil, then sets the relation on this document.

@example Build the relation.

person.__build__(:addresses, { :id => 1 }, metadata)

@param [ String, Symbol ] name The name of the relation. @param [ Hash, BSON::ObjectId ] object The id or attributes to use. @param [ Metadata ] metadata The relation's metadata. @param [ true, false ] building If we are in a build operation.

@return [ Proxy ] The relation.

@since 2.0.0.rc.1

# File lib/mongoid/relations/accessors.rb, line 24
def __build__(name, object, metadata)
  relation = create_relation(object, metadata)
  set_relation(name, relation)
end
create_relation(object, metadata) click to toggle source

Create a relation from an object and metadata.

@example Create the relation.

person.create_relation(document, metadata)

@param [ Document, Array<Document ] object The relation target. @param [ Metadata ] metadata The relation metadata.

@return [ Proxy ] The relation.

@since 2.0.0.rc.1

# File lib/mongoid/relations/accessors.rb, line 40
def create_relation(object, metadata)
  type = @attributes[metadata.inverse_type]
  target = metadata.builder(self, object).build(type)
  target ? metadata.relation.new(self, target, metadata) : nil
end
reset_relation_criteria(name) click to toggle source

Resets the criteria inside the relation proxy. Used by many to many relations to keep the underlying ids array in sync.

@example Reset the relation criteria.

person.reset_relation_criteria(:preferences)

@param [ Symbol ] name The name of the relation.

@since 3.0.14

# File lib/mongoid/relations/accessors.rb, line 55
def reset_relation_criteria(name)
  if instance_variable_defined?("@_#{name}")
    send(name).reset_unloaded
  end
end
set_relation(name, relation) click to toggle source

Set the supplied relation to an instance variable on the class with the provided name. Used as a helper just for code cleanliness.

@example Set the proxy on the document.

person.set(:addresses, addresses)

@param [ String, Symbol ] name The name of the relation. @param [ Proxy ] relation The relation to set.

@return [ Proxy ] The relation.

@since 2.0.0.rc.1

# File lib/mongoid/relations/accessors.rb, line 73
def set_relation(name, relation)
  instance_variable_set("@_#{name}", relation)
end

Private Instance Methods

get_relation(name, metadata, object, reload = false) click to toggle source

Get the relation. Extracted out from the getter method to avoid infinite recursion when overriding the getter.

@api private

@example Get the relation.

document.get_relation(:name, metadata)

@param [ Symbol ] name The name of the relation. @param [ Metadata ] metadata The relation metadata. @param [ true, false ] reload If the relation is to be reloaded.

@return [ Proxy ] The relation.

@since 3.0.16

# File lib/mongoid/relations/accessors.rb, line 94
def get_relation(name, metadata, object, reload = false)
  if !reload && (value = ivar(name)) != false
    value
  else
    _building do
      _loading do
        if object && needs_no_database_query?(object, metadata)
          __build__(name, object, metadata)
        else
          __build__(name, attributes[metadata.key], metadata)
        end
      end
    end
  end
end
needs_no_database_query?(object, metadata) click to toggle source
# File lib/mongoid/relations/accessors.rb, line 110
def needs_no_database_query?(object, metadata)
  object.is_a?(Document) && !object.embedded? &&
    object.id == attributes[metadata.key]
end
without_autobuild() { || ... } click to toggle source

Yield to the block with autobuild functionality turned off.

@example Execute without autobuild.

document.without_autobuild do
  document.name
end

@return [ Object ] The result of the yield.

@since 3.0.0

# File lib/mongoid/relations/accessors.rb, line 137
def without_autobuild
  Threaded.begin_execution("without_autobuild")
  yield
ensure
  Threaded.exit_execution("without_autobuild")
end
without_autobuild?() click to toggle source

Is the current code executing without autobuild functionality?

@example Is autobuild disabled?

document.without_autobuild?

@return [ true, false ] If autobuild is disabled.

@since 3.0.0

# File lib/mongoid/relations/accessors.rb, line 123
def without_autobuild?
  Threaded.executing?(:without_autobuild)
end