Rails 4.2.0中的简单整数赋值的RangeError应该通过validation捕获
*更新:现在已修复4.2.stable和4.2.1 *
在Rails 4.2.0(和当前的4.2.stable)中, ensure_in_range
方法在ARvalidation之前发生,产生RangeError
如果我做一些简单的事情
@obj.threshold = 10_000_000_000
在具有postgres类型整数的列上
threshold | integer |
它产量
RangeError:10000000000超出ActiveRecord :: ConnectionAdapters :: PostgreSQL :: OID :: Integer的范围,限制为4来自… / 2.0.0-p598 / lib / ruby / gems / 2.0.0 / bundler / gems / rails -62e9e61f2d1b / activerecord / lib / active_record / type / integer.rb:41:在`ensure_in_range’中
这是真的! 但告诉用户。 有一个像ActiveRecord模型validation
validates :threshold, presence: true, numericality: { greater_than_or_equal_to: 0, less_than: 1_000_000}
我无法想象这是预期的行为,任何人都有任何解释为什么这种类型转换在validation之前发生?
获取最新的rails版本来修复此错误, 最近由Sean Griffin修复
要在版本发布之前执行此操作,请删除gemfile中的特定版本并使用git location提示:
gem 'rails', :git => 'https://github.com/rails/rails.git'
您可以强制迁移文件使用BigInt。 我遇到了同样的问题,但我没有使用Rails,只是使用ActiveRecord。 这将解决您的错误:
t.integer :really_big_int, limit: 8
如果您只有一个validation,那么升级到Rails 4.2.1就可以了。 但是,如果您有多个validation,例如validation唯一性,则必须升级到比4.2.1更新的版本。 我升级到4.2.3。 我不知道4.2.2是否有效。
在我的情况下,这也发生在简单的地方(some_id:BIG_NUMBER_HERE)。 我不会按预期描述它,这应该导致ActiveRecord :: RecordNotFound