-
Notifications
You must be signed in to change notification settings - Fork 21.4k
/
numericality.rb
35 lines (31 loc) · 1.39 KB
/
numericality.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# frozen_string_literal: true
module ActiveRecord
module Validations
class NumericalityValidator < ActiveModel::Validations::NumericalityValidator # :nodoc:
def validate_each(record, attribute, value, precision: nil, scale: nil)
precision = [column_precision_for(record, attribute) || Float::DIG, Float::DIG].min
scale = column_scale_for(record, attribute)
super(record, attribute, value, precision: precision, scale: scale)
end
private
def column_precision_for(record, attribute)
record.class.type_for_attribute(attribute.to_s)&.precision
end
def column_scale_for(record, attribute)
record.class.type_for_attribute(attribute.to_s)&.scale
end
end
module ClassMethods
# Validates whether the value of the specified attribute is numeric by
# trying to convert it to a float with Kernel.Float (if <tt>only_integer</tt>
# is +false+) or applying it to the regular expression <tt>/\A[\+\-]?\d+\z/</tt>
# (if <tt>only_integer</tt> is set to +true+). Kernel.Float precision
# defaults to the column's precision value or 15.
#
# See ActiveModel::Validations::HelperMethods.validates_numericality_of for more information.
def validates_numericality_of(*attr_names)
validates_with NumericalityValidator, _merge_attributes(attr_names)
end
end
end
end