class ActiveModel::Validations::NumericalityValidator

def validate_each(record, attr_name, value)

def validate_each(record, attr_name, value)
  before_type_cast = "#{attr_name}_before_type_cast"
  raw_value = record.send("#{attr_name}_before_type_cast") if record.respond_to?(before_type_cast.to_sym)
  raw_value ||= value
  return if options[:allow_nil] && raw_value.nil?
  unless value = parse_raw_value_as_a_number(raw_value)
    record.errors.add(attr_name, :not_a_number, filtered_options(raw_value))
    return
  end
  if options[:only_integer]
    unless value = parse_raw_value_as_an_integer(raw_value)
      record.errors.add(attr_name, :not_an_integer, filtered_options(raw_value))
      return
    end
  end
  options.slice(*CHECKS.keys).each do |option, option_value|
    case option
    when :odd, :even
      unless value.to_i.send(CHECKS[option])
        record.errors.add(attr_name, option, filtered_options(value))
      end
    else
      option_value = option_value.call(record) if option_value.is_a?(Proc)
      option_value = record.send(option_value) if option_value.is_a?(Symbol)
      unless value.send(CHECKS[option], option_value)
        record.errors.add(attr_name, option, filtered_options(value).merge(:count => option_value))
      end
    end
  end
end