ruby-on-rails - 如何筛选 Rails 模型中太大的整数?

标签 ruby-on-rails postgresql ruby-on-rails-4 model integer

我正在使用 Rails 4.2.7 和 PostGres 9.5。我的 Rails 迁移中有这个专栏......

my_num               | integer                     | 

在我的模型中,我想筛选出太大的数字并将它们设置为零。例如,数字“659722222222222”正在我的模型上设置并导致以下错误

Error during processing: (RangeError) 659722222222222 is out of range for ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer with limit 4
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/type/integer.rb:45:in `ensure_in_range'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/type/integer.rb:23:in `type_cast_for_database'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/connection_adapters/abstract/quoting.rb:13:in `quote'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-import-0.16.1/lib/activerecord-import/import.rb:641:in `block (2 levels) in values_sql_for_columns_and_attributes'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-import-0.16.1/lib/activerecord-import/import.rb:631:in `each'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-import-0.16.1/lib/activerecord-import/import.rb:631:in `each_with_index'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-import-0.16.1/lib/activerecord-import/import.rb:631:in `each'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-import-0.16.1/lib/activerecord-import/import.rb:631:in `map'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-import-0.16.1/lib/activerecord-import/import.rb:631:in `block in values_sql_for_columns_and_attributes'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-import-0.16.1/lib/activerecord-import/import.rb:630:in `map'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-import-0.16.1/lib/activerecord-import/import.rb:630:in `values_sql_for_columns_and_attributes'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-import-0.16.1/lib/activerecord-import/import.rb:530:in `import_without_validations_or_callbacks'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-import-0.16.1/lib/activerecord-import/import.rb:490:in `import_with_validations'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-import-0.16.1/lib/activerecord-import/import.rb:417:in `import_helper'
/Users/davea/.rvm/gems/ruby-2.3.0/gems/activerecord-import-0.16.1/lib/activerecord-import/import.rb:331:in `import'
/Users/davea/Documents/workspace//app/services/abstract_import_service.rb:161:in `block in save_my_object__time_results'

我不想保存模型,仅当它设置为对于 PostGres SQL 来说太大的整数值时,我才想将字段设置为 nil。我该怎么做?

请注意,我不想更改 PostGres 列的列类型。您认为这不会那么容易,是吗?

最佳答案

2147483647 是 Postgres 中整数类型的最大值。

before_save :is_too_big

def is_too_big
  if my_num > 2147483647
    # do something
  end
end

如果你不想在代码中加入一个魔数(Magic Number),我建议你在超出范围时捕获一个异常:

# somewhere in the code
u = User.new(my_num: 2147483648)
begin
 u.save
rescue RangeError => e
 u.my_num = nil
 u.save
end

关于ruby-on-rails - 如何筛选 Rails 模型中太大的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41103896/

相关文章:

ruby-on-rails - 从第二个数据库中提取数据的有效方法?

ruby-on-rails - 在 Rails 4 中创建到外部 URL 的 Rails 路由

ruby-on-rails - Rails 4 强参数获得嵌套模型的许可

jquery - "(#tabs).tabs is not a function"- 使用 Rails 3.1.3 安装 jquery 有什么问题?

ruby-on-rails - 将 Rails cookie 设置为在 1 天内过期

ruby-on-rails - 您可以从局部中获取 Rails 局部的名称吗?

ruby-on-rails - 重定向域以通过 apache 或 rails 将本地包含在 url 中

postgresql - 如何使用uuid搜索数据库?

sql - PostgreSQL 中的条件语句

sql - 在无关列上的 Postgresql 错误中选择 Distinct