Sha256: 9bc256baa6c0e0853c79e887f7dcf2ba306c4512c6dd8293abae01bad7518719

Contents?: true

Size: 1.6 KB

Versions: 1

Compression:

Stored size: 1.6 KB

Contents

module DataMapper
  module Validations
    
    class UniqueValidator < GenericValidator
      
      def initialize(field_name, options = {})
        @options = options
        @field_name = field_name.to_sym
      end
      
      def call(target)
        unless valid?(target)
          error_message = '%s has already been taken'.t(Inflector.humanize(@field_name))
          add_error(target, error_message , @field_name)
          return false
        end
        
        return true
      end
      
      def valid?(target)
        field_value = target.instance_variable_get("@#{@field_name}")
        return true if @options[:allow_nil] && field_value.nil?
        
        finder_options = { @field_name => field_value }
        
        if @options[:scope]
          scope_value = target.instance_variable_get("@#{@options[:scope]}")
          finder_options.merge! @options[:scope] => scope_value
        end
        
        finder_options.merge!({ target.session.table(target.class).key.name.not => target.key }) unless target.new_record?
        target.session.first(target.class, finder_options).nil?
      end
      
    end
    
    module ValidatesUniquenessOf
      def self.included(base)
        base.extend(ClassMethods)
      end
      
      module ClassMethods
        # No bueno?
        DEFAULT_OPTIONS = { :on => :save }

        def validates_uniqueness_of(field, options = {})
          opts = retrieve_options_from_arguments_for_validators([options], DEFAULT_OPTIONS)
          validations.context(opts[:context]) << Validations::UniqueValidator.new(field, opts)
        end

      end
    end
    
  end  
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
datamapper-0.2.3 lib/data_mapper/validations/unique_validator.rb