首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何筛选Rails模型中太大的整数?

如何筛选Rails模型中太大的整数?
EN

Stack Overflow用户
提问于 2016-12-12 15:14:23
回答 2查看 344关注 0票数 0

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

代码语言:javascript
复制
my_num               | integer                     | 

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

代码语言:javascript
复制
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太大的整数值时。我该怎么做?

注意,我不想更改PostGres列的teh列类型。你不认为这会那么容易,对吧?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-12 15:38:23

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

代码语言:javascript
复制
before_save :is_too_big

def is_too_big
  if my_num > 2147483647
    # do something
  end
end

如果您不想在代码中添加一个神奇的数字,我建议您在超出范围的情况下捕捉到意外:

代码语言:javascript
复制
# somewhere in the code
u = User.new(my_num: 2147483648)
begin
 u.save
rescue RangeError => e
 u.my_num = nil
 u.save
end
票数 2
EN

Stack Overflow用户

发布于 2016-12-12 15:33:53

添加前验证事件

代码语言:javascript
复制
before_validation :ensure_my_num_ok

如果它是坏的,只需设置值

代码语言:javascript
复制
def ensure_my_num_ok
  self.my_num = nil  if my_num > 100000000
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41103896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档