class Mongoid::Association::Referenced::NestedAttributes::One

Attributes

destroy[RW]

Public Class Methods

new(association, attributes, options) click to toggle source

Create the new builder for nested attributes on one-to-one associations.

@example Instantiate the builder.

One.new(association, attributes)

@param [ Association ] association The association metadata. @param [ Hash ] attributes The attributes hash to attempt to set. @param [ Hash ] options The options defined.

@since 2.0.0

# File lib/mongoid/association/referenced/has_one/nested_builder.rb, line 51
def initialize(association, attributes, options)
  @attributes = attributes.with_indifferent_access
  @association = association
  @options = options
  @destroy = @attributes.delete(:_destroy)
end

Public Instance Methods

build(parent) click to toggle source

Builds the association depending on the attributes and the options passed to the macro.

@example Build a 1-1 nested document.

one.build(person, as: :admin)

@note This attempts to perform 3 operations, either one of an update of

the existing association, a replacement of the association with a new
document, or a removal of the association.

@param [ Document ] parent The parent document.

@return [ Document ] The built document.

@since 2.0.0

# File lib/mongoid/association/referenced/has_one/nested_builder.rb, line 27
def build(parent)
  return if reject?(parent, attributes)
  @existing = parent.send(association.name)
  if update?
    attributes.delete_id
    existing.assign_attributes(attributes)
  elsif replace?
    parent.send(association.setter, Factory.build(association.klass, attributes))
  elsif delete?
    parent.send(association.setter, nil)
  end
end

Private Instance Methods

acceptable_id?() click to toggle source

Is the id in the attribtues acceptable for allowing an update to the existing association?

@api private

@example Is the id acceptable?

one.acceptable_id?

@return [ true, false ] If the id part of the logic will allow an update.

@since 2.0.0

# File lib/mongoid/association/referenced/has_one/nested_builder.rb, line 71
def acceptable_id?
  id = convert_id(existing.class, attributes[:_id])
  existing._id == id || id.nil? || (existing._id != id && update_only?)
end
delete?() click to toggle source

Can the existing association be deleted?

@example Can the existing object be deleted?

one.delete?

@return [ true, false ] If the association should be deleted.

@since 2.0.0

# File lib/mongoid/association/referenced/has_one/nested_builder.rb, line 84
def delete?
  destroyable? && !attributes[:_id].nil?
end
destroyable?() click to toggle source

Can the existing association potentially be destroyed?

@example Is the object destroyable?

one.destroyable?({ :_destroy => "1" })

@return [ true, false ] If the association can potentially be

destroyed.

@since 2.0.0

# File lib/mongoid/association/referenced/has_one/nested_builder.rb, line 97
def destroyable?
  [ 1, "1", true, "true" ].include?(destroy) && allow_destroy?
end
replace?() click to toggle source

Is the document to be replaced?

@example Is the document to be replaced?

one.replace?

@return [ true, false ] If the document should be replaced.

@since 2.0.0

# File lib/mongoid/association/referenced/has_one/nested_builder.rb, line 109
def replace?
  !existing && !destroyable? && !attributes.blank?
end
update?() click to toggle source

Should the document be updated?

@example Should the document be updated?

one.update?

@return [ true, false ] If the object should have its attributes updated.

@since 2.0.0

# File lib/mongoid/association/referenced/has_one/nested_builder.rb, line 121
def update?
  existing && !destroyable? && acceptable_id?
end