# frozen_string_literal: true class UniqueAmongValidator < ActiveRecord::Validations::UniquenessValidator def validate_each(record, attribute, value) old_errors = [] record.errors.each do |error| old_errors << error if error.attribute == attribute end # look for any duplicates at all super new_errors = [] record.errors.each do |error| new_errors << error if error.attribute == attribute end # do nothing further unless there were some duplicates. if new_errors.size - old_errors.size != 0 # now look only in the collection we care about. dupes = options[:collection].call(record).where("lower(#{attribute}) = ?", value.downcase) dupes = dupes.where("id != ?", record.id) if record.persisted? # pop off the error, if it was a false positive if !dupes.exists? record.errors.delete(attribute) old_errors.each do |error| record.errors.add( error.attribute, error.type, **error.options ) end end end end end