ActiveRecord less_than_or_equal_to ошибка проверки при равных значениях - PullRequest
0 голосов
/ 11 апреля 2019

Я определил эту проверку 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

Как это могло быть возможно?

Редактировать: Я видел, что сравниваемые значения анализировались как число ранее, но результат, кажется, тот же...

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

В конце концов, я понял, что происходит. В основном, проблема связана с ошибкой, которая присутствовала при проверках ActiveModel, хорошо описанной здесь , которая была решена здесь и выпущена в версии 5.2.3 .

Если вы сильно отстаете от этой версии, как и я, и не хотите обновляться, я предлагаю внедрить собственный валидатор, расширяющий ActiveModel::EachValidator, вдохновленный текущим NumericityValidator , и использовать его для каждой проверки на числовые значения.

0 голосов
/ 11 апреля 2019

Как рассчитываются цифры?Может быть проблема с предварительным разрешением:

[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

...