UniquenessValidator

Constants

Methods

#found

def found(record, attribute, value)
  conditions = scope_conditions(record)

  # TODO: Added as find(:name => nil) throws error
  value = '' if value.nil?

  conditions[attribute] = options[:case_sensitive] ? value : /#{Regexp.escape(value.to_s)}/i

  found = record.class.as(:result).where(conditions)
  found = found.where_not(neo_id: record.neo_id) if record._persisted_obj
  found
end

#initialize

def initialize(options)
  super(options.reverse_merge(case_sensitive: true))
end

#message

def message(instance)
  super || 'has already been taken'
end

#scope_conditions

def scope_conditions(instance)
  Array(options[:scope] || []).inject({}) do |conditions, key|
    conditions.merge(key => instance[key])
  end
end

#validate_each

def validate_each(record, attribute, value)
  return unless found(record, attribute, value).exists?

  record.errors.add(attribute, :taken, options.except(:case_sensitive, :scope).merge(value: value))
end