12

* 更新:这已在 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 is out of range for ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer with limit 4 from .../2.0.0-p598/lib/ruby/gems/2.0.0/bundler/gems/rails -62e9e61f2d1b/activerecord/lib/active_record/type/integer.rb:41:in `ensure_in_range'

这是真的!但告诉用户。有一个 ActiveRecord 模型验证,例如

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

我无法想象这是预期的行为,任何人有任何解释为什么这种类型转换发生在验证之前?

4

4 回答 4

5

获取最新的 rails 版本来修复这个错误,它最近由 Sean Griffin 修复

要在版本发布之前执行此操作,请删除 gemfile 中的特定版本并使用 git 位置提示:

gem 'rails', :git => 'https://github.com/rails/rails.git'
于 2015-01-23T22:52:16.177 回答
2

您可以强制迁移文件使用 BigInt。我遇到了同样的问题,但我没有使用 Rails,而只是使用 ActiveRecord。这将解决您的错误:

t.integer :really_big_int, limit: 8

于 2015-12-04T10:18:44.557 回答
0

如果你有一个单一的验证,那么升级到 Rails 4.2.1 就可以了。但是,如果您有多个验证,例如还验证唯一性,则必须升级到比 4.2.1 更新的版本。我升级到 4.2.3。我不知道 4.2.2 是否有效。

于 2015-08-14T01:35:02.367 回答
0

就我而言,这也发生在简单的 where(some_id: BIG_NUMBER_HERE) 上。我不会按预期描述它,这应该会导致 ActiveRecord::RecordNotFound

于 2015-08-20T09:56:20.280 回答