class Mongoid::Fields::ForeignKey

Public Instance Methods

add_atomic_changes(document, name, key, mods, new_elements, old_elements) click to toggle source

Adds the atomic changes for this type of resizable field.

@example Add the atomic changes.

field.add_atomic_changes(doc, "key", {}, [], [])

@todo: Durran: Refactor, big time.

@param [ Document ] document The document to add to. @param [ String ] name The name of the field. @param [ String ] key The atomic location of the field. @param [ Hash ] mods The current modifications. @param [ Array ] new_elements The new elements to add. @param [ Array ] old_elements The old elements getting removed.

@since 2.4.0

# File lib/mongoid/fields/foreign_key.rb, line 23
def add_atomic_changes(document, name, key, mods, new_elements, old_elements)
  old = (old_elements || [])
  new = (new_elements || [])
  if new.length > old.length
    if new.first(old.length) == old
      document.atomic_array_add_to_sets[key] = new.drop(old.length)
    else
      mods[key] = document.attributes[name]
    end
  elsif new.length < old.length
    pulls = old - new
    if new == old - pulls
      document.atomic_array_pulls[key] = pulls
    else
      mods[key] = document.attributes[name]
    end
  elsif new != old
    mods[key] = document.attributes[name]
  end
end
evolve(object) click to toggle source

Evolve the object into an id compatible object.

@example Evolve the object.

field.evolve(object)

@param [ Object ] object The object to evolve.

@return [ Object ] The evolved object.

@since 3.0.0

# File lib/mongoid/fields/foreign_key.rb, line 66
def evolve(object)
  if object_id_field? || object.is_a?(Document)
    if association.polymorphic?
      association.convert_to_foreign_key(object)
    else
      object.__evolve_object_id__
    end
  else
    related_id_field.evolve(object)
  end
end
foreign_key?() click to toggle source

Is this field a foreign key?

@example Is the field a foreign key?

field.foreign_key?

@return [ true, false ] If the field is a foreign key.

@since 2.4.0

# File lib/mongoid/fields/foreign_key.rb, line 52
def foreign_key?
  true
end
lazy?() click to toggle source

Does this field do lazy default evaluation?

@example Is the field lazy?

field.lazy?

@return [ true, false ] If the field is lazy.

@since 3.1.0

# File lib/mongoid/fields/foreign_key.rb, line 86
def lazy?
  type.resizable?
end
mongoize(object) click to toggle source

Mongoize the object into the Mongo friendly value.

@example Mongoize the object.

field.mongoize(object)

@param [ Object ] object The object to Mongoize.

@return [ Object ] The mongoized object.

@since 3.0.0

# File lib/mongoid/fields/foreign_key.rb, line 100
def mongoize(object)
  if type.resizable? || object_id_field?
    type.__mongoize_fk__(association, object)
  else
    related_id_field.mongoize(object)
  end
end
object_id_field?() click to toggle source

Is the field a BSON::ObjectId?

@example Is the field a BSON::ObjectId?

field.object_id_field?

@return [ true, false ] If the field is a BSON::ObjectId.

@since 2.2.0

# File lib/mongoid/fields/foreign_key.rb, line 116
def object_id_field?
  @object_id_field ||=
      association.polymorphic? ? true : association.klass.using_object_ids?
end
resizable?() click to toggle source

Returns true if an array, false if not.

@example Is the field resizable?

field.resizable?

@return [ true, false ] If the field is resizable.

@since 3.0.2

# File lib/mongoid/fields/foreign_key.rb, line 129
def resizable?
  type.resizable?
end

Private Instance Methods

evaluate_default_proc(doc) click to toggle source

Evaluate the default proc. In some cases we need to instance exec, in others we don’t.

@example Eval the default proc.

field.evaluate_default_proc(band)

@param [ Document ] doc The document.

@return [ Object ] The called proc.

@since 3.0.0

# File lib/mongoid/fields/foreign_key.rb, line 146
def evaluate_default_proc(doc)
  serialize_default(default_val[])
end
serialize_default(object) click to toggle source

This is used when default values need to be serialized. Most of the time just return the object.

@api private

@example Serialize the default value.

field.serialize_default(obj)

@param [ Object ] object The default.

@return [ Object ] The serialized default.

@since 3.0.0

# File lib/mongoid/fields/foreign_key.rb, line 177
def serialize_default(object); object; end