
module ActiveRecord
  module Validations
    module ClassMethods
      # Automatically validates the column against the schema definition
      # for nullability, format, and enumerations. Handles integers, floats,
      # enumerations, and string limits.
      #
      # Usage: validates_columns :severity, :name
      def validates_columns(*column_names)
        begin
          cols = columns_hash
          column_names.each do |name|
            col = cols[name.to_s]
            raise ArgumentError, "Cannot find column #{name}" unless col
            
            # test for nullability
            validates_presence_of(name) if !col.null
            
            # Test various known types.
            case col.type
            when :enum
              validates_inclusion_of name, :in => col.limit, :allow_nil => true
              
            when :integer, :float
              validates_numericality_of name, :allow_nil => true
              
            when :string
              if col.limit
                validates_length_of name, :maximum => col.limit, :allow_nil => true
              end
            end
          end
        rescue ActiveRecord::StatementInvalid=>e
          raise e unless e.message.include?("42S02") # swallow the exception if its for a missing table
        end
      end
    end
  end
end
