【发布时间】: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