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