class Mongoid::Relations::Proxy

This class is the superclass for all relation proxy objects, and contains common behaviour for all of them.

Attributes

__metadata[RW]
base[RW]
relation_metadata[RW]
target[RW]

Protected Class Methods

apply_ordering(criteria, metadata) click to toggle source

Apply ordering to the criteria if it was defined on the relation.

@example Apply the ordering.

Proxy.apply_ordering(criteria, metadata)

@param [ Criteria ] criteria The criteria to modify. @param [ Metadata ] metadata The relation metadata.

@return [ Criteria ] The ordered criteria.

@since 3.0.6

# File lib/mongoid/relations/proxy.rb, line 208
def apply_ordering(criteria, metadata)
  metadata.order ? criteria.order_by(metadata.order) : criteria
end

Public Instance Methods

extend_proxies(*extension) click to toggle source

Allow extension to be an array and extend each module

# File lib/mongoid/relations/proxy.rb, line 47
def extend_proxies(*extension)
  extension.flatten.each {|ext| extend_proxy(ext) }
end
init(base, target, metadata) { |self| ... } click to toggle source

Convenience for setting the target and the metadata properties since all proxies will need to do this.

@example Initialize the proxy.

proxy.init(person, name, metadata)

@param [ Document ] base The base document on the proxy. @param [ Document, Array<Document> ] target The target of the proxy. @param [ Metadata ] metadata The relation's metadata.

@since 2.0.0.rc.1

# File lib/mongoid/relations/proxy.rb, line 40
def init(base, target, metadata)
  @base, @target, @__metadata = base, target, metadata
  yield(self) if block_given?
  extend_proxies(metadata.extension) if metadata.extension?
end
klass() click to toggle source

Get the class from the metadata, or return nil if no metadata present.

@example Get the class.

proxy.klass

@return [ Class ] The relation class.

@since 3.0.15

# File lib/mongoid/relations/proxy.rb, line 59
def klass
  __metadata ? __metadata.klass : nil
end
reset_unloaded() 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.preferences.reset_relation_criteria

@since 3.0.14

# File lib/mongoid/relations/proxy.rb, line 70
def reset_unloaded
  target.reset_unloaded(criteria)
end
substitutable() click to toggle source

The default substitutable object for a relation proxy is the clone of the target.

@example Get the substitutable.

proxy.substitutable

@return [ Object ] A clone of the target.

@since 2.1.6

# File lib/mongoid/relations/proxy.rb, line 83
def substitutable
  target
end

Protected Instance Methods

callback_method(callback_name) click to toggle source

Return the name of defined callback method

@example returns the before_add callback method name

callback_method(:before_add)

@param [ Symbol ] which callback

@return [ Array ] with callback methods to be executed, the array may have symbols and Procs

@since 3.1.0

# File lib/mongoid/relations/proxy.rb, line 161
def callback_method(callback_name)
  methods = []
  metadata = __metadata[callback_name]
  if metadata
    if metadata.is_a?(Array)
      methods.concat(metadata)
    else
      methods << metadata
    end
  end
  methods
end
characterize_one(document) click to toggle source

Takes the supplied document and sets the metadata on it.

@example Set the metadata.

proxt.characterize_one(name)

@param [ Document ] document The document to set on.

@since 2.0.0.rc.4

# File lib/mongoid/relations/proxy.rb, line 110
def characterize_one(document)
  document.__metadata = __metadata unless document.__metadata
end
collection() click to toggle source

Get the collection from the root of the hierarchy.

@example Get the collection.

relation.collection

@return [ Collection ] The root's collection.

@since 2.0.0

# File lib/mongoid/relations/proxy.rb, line 97
def collection
  root = base._root
  root.collection unless root.embedded?
end
execute_callback(callback, doc) click to toggle source

Executes a callback method

@example execute the before add callback

execute_callback(:before_add)

@param [ Symbol ] callback to be executed

@since 3.1.0

# File lib/mongoid/relations/proxy.rb, line 182
def execute_callback(callback, doc)
  callback_method = callback_method(callback)
  if callback_method
    callback_method.each do |c|
      if c.is_a? Proc
        c.call(base, doc)
      else
        base.send c, doc
      end
    end
  end
end
method_missing(name, *args, &block) click to toggle source

Default behavior of method missing should be to delegate all calls to the target of the proxy. This can be overridden in special cases.

@param [ String, Symbol ] name The name of the method. @param [ Array ] *args The arguments passed to the method.

# File lib/mongoid/relations/proxy.rb, line 119
def method_missing(name, *args, &block)
  target.send(name, *args, &block)
end
raise_mixed() click to toggle source

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.

@since 2.0.0

# File lib/mongoid/relations/proxy.rb, line 132
def raise_mixed
  raise Errors::MixedRelations.new(base.class, __metadata.klass)
end
raise_unsaved(doc) click to toggle source

When the base is not yet saved and the user calls create or create! on the relation, 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.

@since 2.0.0.rc.6

# File lib/mongoid/relations/proxy.rb, line 147
def raise_unsaved(doc)
  raise Errors::UnsavedDocument.new(base, doc)
end