在尝试保存大(ish)整数值时,获取指示数字的错误“超出ActiveRecord :: Type :: Integer且限制为4的范围”

时间:2015-04-09 12:29:52

标签: ruby sqlite activerecord

我在我的Ruby应用程序中使用SQLite + ActiveRecord,这是我在尝试向整数字段写入一个大数字时得到的错误:

  

1428584647765超出了ActiveRecord :: Type :: Integer的范围   限制4

但根据SQLite文档:

  

该值是有符号整数,存储为1,2,3,4,6或8个字节,具体取决于值的大小。

8个字节是存储整数1428584647765的足够空间,那么为什么ActiveRecord会给我一个错误?为什么它认为这是一个4字节的字段?

3 个答案:

答案 0 :(得分:34)

我遇到了同样的问题,上面的答案给了我一个如何修理我的线索。我提出了一些解决问题的答案。

您可以通过设置表格列的限制来执行此操作。

<强>哈克/步骤

  1. 运行迁移以更改表列。 e.g。

    rails generate migration change_integer_limit_in_your_table

    注意:代码中的your_table将是您的复数表格

  2. 编辑生成的迁移,使生成的迁移如下所示:

    class ChangeIntegerLimitInYourTable < ActiveRecord::Migration
       def change
         change_column :your_table, :your_column, :integer, limit: 8
       end 
     end
    

    注意:代码中的限制为8是存储大小,范围从-9223372036854775808到+9223372036854775807,并且称为bigint,即大范围整数。

    < / LI>
  3. 运行rake db:migrate以迁移您的数据库。

  4. 运行rails server重新启动服务器,您就可以运行了。

  5. 有关数字类型的详细信息,请参阅https://www.postgresql.org/docs/9.4/static/datatype-numeric.html

答案 1 :(得分:15)

美好的一天。 默认情况下,列创建为len = 32字节

要进行更改,您可以创建迁移,例如:

t.integer :some_field, :limit => 8

答案 2 :(得分:0)

我今天也偶然发现了PostgreSQL这个问题。我知道这个问题很旧,并且作者使用的是SQLite,但由于很多人似乎都像我这样允许我发布更新的解决方案,因此最终来到这里。

对于 Rails 5.1 (我相信适用于4.1及更高版本,但未测试)和 PostgreSQL (可能也与其他数据库一起使用),正确的方法是设置列键入bigint,使用limit: 8选项不会影响数据库。

这是示例代码,其中使用名为products的表和名为quantity的列:

class ChangeProductsQuantityToBigint < ActiveRecord::Migration[5.1]
  def change
    change_column :products, :quantity, :bigint
  end
end