lib/hydra/validations/uniqueness_validator.rb in hydra-validations-0.1.0 vs lib/hydra/validations/uniqueness_validator.rb in hydra-validations-0.2.0

- old
+ new

@@ -1,5 +1,7 @@ +require 'hydra/validations' + module Hydra module Validations # # UniquenessValidator - an ActiveFedora model validator # @@ -9,31 +11,29 @@ # validates_uniqueness_of :field, solr_name: "field_ssim" # # Restrictions: # # - Accepts only one attribute (can have more than one UniquenessValidator on a model, however) - # - Attribute cannot be multi-valued (:multiple=>true option of `has_attributes') # - :solr_name option must be present + # - Can be used on enumerable values (attribute defined with :multiple=>true option), but + # validator subclasses SingleCardinalityValidator, so will not pass validation if enumerable + # has more than one member. # # CAVEAT: The determination of uniqueness depends on a Solr query. # False negatives (record invalid) may result if, for example, # querying a Solr field of type "text". # - class UniquenessValidator < ActiveModel::EachValidator + class UniquenessValidator < SingleCardinalityValidator - def initialize(options = {}) - super - attributes.each do |attr| - raise ArgumentError, "Cannot validate uniqueness on a multi-valued attribute: #{attribute}." if options[:class].multiple?(attr) - end - end - def check_validity! + super raise ArgumentError, "UniquenessValidator accepts only a single attribute: #{attribues}" if attributes.length > 1 raise ArgumentError, "UniquenessValidator requires the :solr_name option be present." unless options[:solr_name].present? end def validate_each(record, attribute, value) + super + value = value.first if record.class.multiple?(attribute) conditions = {options[:solr_name] => value} conditions.merge!("-id" => record.id) if record.persisted? if record.class.exists? conditions record.errors.add attribute, "has already been taken" end