class DataMapper::Validations::UniquenessValidator
@author Guy van den Berg @since 0.9
Public Class Methods
new(field_name, options = {})
click to toggle source
Calls superclass method
DataMapper::Validations::GenericValidator.new
# File lib/dm-validations/validators/uniqueness_validator.rb, line 9 def initialize(field_name, options = {}) if options.has_key?(:scope) assert_kind_of('scope', options[:scope], Array, Symbol) end super set_optional_by_default end
Public Instance Methods
call(target)
click to toggle source
# File lib/dm-validations/validators/uniqueness_validator.rb, line 19 def call(target) return true if valid?(target) error_message = @options[:message] || ValidationErrors.default_error_message(:taken, field_name) add_error(target, error_message, field_name) false end
valid?(target)
click to toggle source
# File lib/dm-validations/validators/uniqueness_validator.rb, line 28 def valid?(target) value = target.validation_property_value(field_name) return true if optional?(value) opts = { :fields => target.model.key(target.repository.name), field_name => value, } Array(@options[:scope]).each { |subject| unless target.respond_to?(subject) raise(ArgumentError,"Could not find property to scope by: #{subject}. Note that :unique does not currently support arbitrarily named groups, for that you should use :unique_index with an explicit validates_uniqueness_of.") end opts[subject] = target.__send__(subject) } resource = DataMapper.repository(target.repository.name) do target.model.first(opts) end return true if resource.nil? target.saved? && resource.key == target.key end