【发布时间】:2015-11-14 00:28:14
【问题描述】:
我刚刚将一个旧应用从 Rails 3.0 升级到 4.2,现在无法在数据库中查询很长的 ID。
导轨 3
Product.where(associated_id: 1311344470881970878875083923).first
=> nil
导轨 4.2.3
Product.where(associated_id: 1311344470881970878875083923).first
RangeError: 1311344470881970878875083923 is out of range for ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer with limit 8
from ~/.rvm/gems/ruby-2.2.1@gemset/gems/activerecord-4.2.3/lib/active_record/type/integer.rb:45:in `ensure_in_range'
在这种情况下,我希望查找器在 Rails 4.2.3 中也不会返回任何内容。只是搜索结果,我们不需要调用ensure_in_range。
更新:但是,以下工作正常(它可以作为一种解决方法):
Product.find_by(associated_id: 1311344470881970878875083923)
之所以有效,是因为find_by 的实现方式如下:
def find_by(*args)
where(*args).take
rescue RangeError
nil
end
http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find_by
不幸的是,ActiveRecord 4.2.3 中缺少用于返回所有结果的类似方法
def find_all_by(*args)
where(*args).load
rescue RangeError
none
end
【问题讨论】:
-
对于整数来说这是一个相当大的数字!
标签: ruby-on-rails-4 activerecord ruby-on-rails-4.2