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