【问题标题】:RangeError for simple integer assignment in Rails 4.2.0 that should be caught by validationRails 4.2.0 中简单整数赋值的 RangeError 应该被验证捕获
【发布时间】:2015-03-21 15:30:05
【问题描述】:

* 更新:现在已在 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::Integer 的范围,限制为 4 来自 .../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}

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

【问题讨论】:

  • 我遇到了同样的问题。还没弄清楚为什么会这样。
  • 这个问题是由 ActiveRecord 的内置类型转换引起的,它在属性设置器中调用(如您所见)。我不知道有什么办法可以绕过它,但我会考虑一下。
  • 在撰写此评论时,仅更新到rails 4.2.1 解决了这个问题,在4.2.0 我仍然得到RangeError

标签: ruby-on-rails ruby postgresql activerecord ruby-on-rails-4.2


【解决方案1】:

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

t.integer :really_big_int, limit: 8

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 在 4.2.3 中,4.2.4 也不起作用: 超出 ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer 的范围,限制为 4
      • 我根据前面提到的 Sean Griffin gem 限制了我的“myint”以使其工作。
      【解决方案4】:

      获取最新的rails版本来修复这个错误,it was recently fixed by Sean Griffin

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

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

      【讨论】:

      • 太棒了。感谢您的提醒。我打算在星期一采取更严厉的措施。 ;)
      • 是否有解决方法,因为我在尝试使用该行 bundle install 时不断收到 Could not find gem 'arel (= 7.0.0.alpha) ruby', which is required by gem 'rails (>= 0) ruby', in any of the sources.
      • @Ryan github.com/rails/rails/issues/19624。将此添加到您的 Gemfile: gem 'arel', github: 'rails/arel'
      猜你喜欢
      • 1970-01-01
      • 2013-05-19
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2023-04-03
      • 1970-01-01
      • 2014-03-11
      相关资源
      最近更新 更多