lib/mongoid/relations/nested_builder.rb
# encoding: utf-8
module Mongoid
module Relations
# This is the superclass for builders that are in charge of handling
# creation, deletion, and updates of documents through that ever so lovely
# #accepts_nested_attributes_for.
class NestedBuilder
attr_accessor :attributes, :existing, :metadata, :options
# Determines if destroys are allowed for this document.
#
# @example Do we allow a destroy?
# builder.allow_destroy?
#
# @return [ true, false ] True if the allow destroy option was set.
#
# @since 2.0.0.rc.1
def allow_destroy?
options[:allow_destroy] || false
end
# Returns the reject if option defined with the macro.
#
# @example Is there a reject proc?
# builder.reject?
#
# @param The parent document of the relation
# @param [ Hash ] attrs The attributes to check for rejection.
#
# @return [ true, false ] True and call proc or method if rejectable, false if not.
#
# @since 2.0.0.rc.1
def reject?(document, attrs)
case callback = options[:reject_if]
when Symbol
document.method(callback).arity == 0 ? document.send(callback) : document.send(callback, attrs)
when Proc
callback.call(attrs)
else
false
end
end
# Determines if only updates can occur. Only valid for one-to-one
# relations.
#
# @example Is this update only?
# builder.update_only?
#
# @return [ true, false ] True if the update_only option was set.
#
# @since 2.0.0.rc.1
def update_only?
options[:update_only] || false
end
# Convert an id to its appropriate type.
#
# @example Convert the id.
# builder.convert_id(Person, "4d371b444835d98b8b000010")
#
# @param [ Class ] klass The class we're trying to convert for.
# @param [ String ] id The id, usually coming from the form.
#
# @return [ BSON::ObjectId, String, Object ] The converted id.
#
# @since 2.0.0.rc.6
def convert_id(klass, id)
klass.using_object_ids? ? BSON::ObjectId.mongoize(id) : id
end
end
end
end