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
我遇到了同样的问题,上面的答案给了我一个如何修复我的线索.我提出了一些解决问题的答案.
您可以通过在表列上设置限制来执行此操作.
哈克/步骤
运行迁移以更改表列.例如
rails generate migration change_integer_limit_in_your_table
注意:your_table代码中的表名将以复数表示
编辑生成的迁移,使生成的迁移如下所示:
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大范围整数.
运行rake db:migrate以迁移数据库.
通过运行重新启动服务器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)
        小智 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)