ActiveRecord less_than_or_equal_to相等值的验证错误

时间:2019-04-11 10:24:27

标签: ruby-on-rails activerecord rails-activerecord

我已经定义了此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,但结果似乎是相同的...

2 个答案:

答案 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的自己的验证器,并将其用于每次验证数值上。