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