RangeError для простого целочисленного назначения в Rails 4.2.0, которое должно быть обнаружено путем проверки

* UPDATE: теперь это исправлено в 4.2.stable и 4.2.1 *

в Rails 4.2.0 (и текущий 4.2.stable) метод ensure_in_range происходит до проверки AR, давая RangeError

если я делаю что-то простое, как

@obj.threshold = 10_000_000_000

в столбце с целым числом типа postgres

 threshold  | integer                     | 

он дает

RangeError: 10000000000 выходит за пределы диапазона для ActiveRecord:: ConnectionAdapters:: PostgreSQL:: OID:: Целое число с лимитом 4 от... /2.0.0-p598/lib/ruby ​​/gems/2.0.0/bundler/gems/rails-62e9e61f2d1b/activerecord/lib/active_record/type/integer.rb: 41: in `обеспечить_in_range '

что верно! но сообщите об этом пользователям. там валидация модели ActiveRecord, например

  validates :threshold,  presence: true,
    numericality: { greater_than_or_equal_to: 0, less_than: 1_000_000}

Я не могу представить, что это ожидаемое поведение, у любого есть какие-либо объяснения, почему этот тип приведения происходит до проверки?

Ответ 1

Получите последнюю версию рельсов, чтобы исправить эту ошибку, она была недавно исправлена ​​Шон Гриффин

Чтобы сделать это до выхода версии, удалите определенную версию в своем gemfile и используйте подсказку git:

gem 'rails', :git => 'https://github.com/rails/rails.git'

Ответ 2

Вы можете заставить файл миграции использовать BigInt. У меня была такая же проблема, но я не использую Rails, а просто ActiveRecord. Это решит вашу ошибку:

t.integer :really_big_int, limit: 8

Ответ 3

Если у вас есть одна проверка, то обновление до Rails 4.2.1 делает трюк. Однако, если у вас есть несколько валидаций, например проверка подлинности, вам нужно перейти на более новую версию, чем 4.2.1. Я обновился до 4.2.3. Я не знаю, работает ли 4.2.2 или нет.

Ответ 4

В моем случае это также происходит в простых случаях (some_id: BIG_NUMBER_HERE). Я бы не описал его так, как ожидалось, это скорее приведет к ActiveRecord:: RecordNotFound