我已经定义了此ActiveRecord验证
validates :attr_1, numericality: {
less_than_or_equal_to: :attr_2,
message: "...",
allow_nil: true,
}, if: [proc { |a| a.attr_2.present? }]
这似乎通常可以正常工作,但是在attr_1 == attr_2
的一种情况下,我得到了误报。
我试图调试在消息中打印值并放入这样的日志消息的问题
validates :attr_1, numericality: {
less_than_or_equal_to: :attr_2,
message: "%{value}, %{count} - ...",
allow_nil: true,
}, if: [proc { |a| Rails.logger.info "#{a.attr_1} <= #{a.attr_2} -> #{a.attr_1 <= a.attr_2}" ; a.attr_2.present? }]
并出现此消息错误
9531.28, 9531.28 - ...
此外,在我看到的日志中
9531.28 <= 9531.28 -> true
怎么可能?
编辑: 我看到要比较的值之前是parsed as number,但结果似乎是相同的...
答案 0 :(得分:0)
数字是如何计算的?也许是个难题:
[12] pry(main)> 9531.280000000001 == 9531.280000000002
false
[13] pry(main)> 9531.2800000000001 == 9531.2800000000002
true
[14] pry(main)> 9531.280000000001 == 9531.280000000002
false
[15] pry(main)> 9531.280000000001.round(3) == 9531.280000000002.round(3)
true
编辑:添加了round
答案 1 :(得分:0)
最后,我弄清楚了发生了什么。基本上,该问题与ActiveModel验证中存在的一个错误有关,该错误已得到很好的描述here,该错误已here得到解决并在version 5.2.3中发布。
如果您像我这样远远落后于此版本,并且不想升级,建议您实施受当前NumericalityValidator启发的扩展ActiveModel::EachValidator
的自己的验证器,并将其用于每次验证数值上。