module Sequel::Plugins::ValidateAssociated::InstanceMethods

Private Instance Methods

delay_validate_associated_object(reflection, obj) click to toggle source

Delay validating the associated object until validating the current object.

# File lib/sequel/plugins/validate_associated.rb, line 29
def delay_validate_associated_object(reflection, obj)
  after_validation_hook{validate_associated_object(reflection, obj)}
end
validate_associated_object(reflection, obj) click to toggle source

Validate the given associated object, adding any validation error messages from the given object to the parent object.

# File lib/sequel/plugins/validate_associated.rb, line 35
def validate_associated_object(reflection, obj)
  return if reflection[:validate] == false
  association = reflection[:name]
  if (reflection[:type] == :one_to_many || reflection[:type] == :one_to_one) && (key = reflection[:key]).is_a?(Symbol) && !(pk_val = obj.values[key])
    # There could be a presence validation on the foreign key in the associated model,
    # which will fail if we validate before saving the current object.  If there is
    # no value for the foreign key, set it to the current primary key value, or a dummy
    # value of 0 if we haven't saved the current object.
    p_key = pk unless pk.is_a?(Array)
    obj.values[key] = p_key || 0
    key = nil if p_key
  end
  obj.errors.full_messages.each{|m| errors.add(association, m)} unless obj.valid?
  if key && !pk_val
    # If we used a dummy value of 0, remove it so it doesn't accidently remain.
    obj.values.delete(key)
  end
end