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

Ser*_*gey 28 ruby sqlite activerecord

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

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

但根据SQLite文档:

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

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

Afo*_*umi 39

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

您可以通过在表列上设置限制来执行此操作.

哈克/步骤

  1. 运行迁移以更改表列.例如

    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
    
    Run Code Online (Sandbox Code Playgroud)

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

  3. 运行rake db:migrate以迁移数据库.

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

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


小智 16

美好的一天.默认情况下,columnt使用len = 32字节创建

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

t.integer :some_field, :limit => 8
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!有没有办法在不使用迁移的情况下更改整数限制? (2认同)
  • @Sergey change_column [:table_name],[:column_name],:integer,limit:20 (2认同)

小智 9

我今天在 PostgreSQL 中也偶然发现了这个问题。我知道这个问题已经很老了,而且作者正在使用 SQLite,但由于很多人似乎都像我一样最终来到这里,让我发布了更新的解决方案。

对于Rails 5.1(我相信 4.1 及更高版本,但没有测试)和PostgreSQL(可能还有其他数据库),正确的方法是将列类型设置为bigint,使用该limit: 8选项不会影响数据库。

这是使用名为 products 的表和名为 amount 的列的示例代码:

class ChangeProductsQuantityToBigint < ActiveRecord::Migration[5.1]
  def change
    change_column :products, :quantity, :bigint
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 这将修复数据库中的限制,但 Rails 不会使用它。我认为这是因为 Rails 不知道 Postgres bigint 是什么。所以 Rail 的整数验证仍然会失败。因此,即使数据库可以接受更大的整数,Rails 也不会。 (4认同)