Ruby on Rails忽略整数限制

6

我需要使用外部提供的64位整数作为用户表的索引,这个整数可以被Rails存储,但如果它是主键就不行了。我有以下迁移代码:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users, :id => false do |t|
      t.integer :id, limit: 8
      t.string :name

      t.timestamps null: false
    end
  end
end

迁移工作正常,没有报错,但是当我试图使用64位整数进行填充时,我收到以下提示:
RangeError: 76561198054432981 is out of range for ActiveRecord::Type::Integer with limit 4

显然,Rails忽略了limit字段,只要它是主键/:id字段?我该如何处理这个问题?

值得一提的是,我正在使用sqlite3(默认设置),但据我所知,sqlite完全能够存储64位整数。

这是来自sqlite的table_info:

0|id|integer(8)|0||0
1|name|varchar|0||0
2|created_at|datetime|1||0
3|updated_at|datetime|1||0

1
你确定这不是SQLite的问题吗?http://jakegoulding.com/blog/2011/02/06/sqlite-64-bit-integers/ - Cristiano Betta
@CristianoBetta 我不这么认为,我尝试添加另一个具有相同规格的列,并使用不同的名称,这很好运行。根据 pragma table_info ,两者以相同方式定义。 - s1gtrap
我在PostgreSQL上遇到了类似的问题。数据库声明列为“bigint”,而列元数据指定限制为8,但是我却收到“out of range for ActiveModel::Type::Integer with limit 4”错误。 - art-solopov
1个回答

3
您提供的限制值是正确的,它对应于BIGINT类型。 enter image description here 确保您的迁移已应用;在某些CLI或GUI软件中打开数据库并验证列类型。 补充: 在迁移中更改列的长度或数据类型将使该列无效作为主键。相反,创建一个初始化程序来覆盖站点默认的主键数据类型应该提供您想要实现的行为:
# config/initializers/change_primary_key_datatype.rb
require 'active_record/connection_adapters/postgresql_adapter'
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:primary_key] = "bigserial primary key"

这是我们为PG数据库所做的事情;这是因为有了

enter image description here


然而,在SQLite的代码库中,存在以下问题:

enter image description here


1
我已经移除了数据库,运行了迁移,尝试了填充数据,但错误仍然存在。sqlite 显示了正确和预期的 :limit。 - s1gtrap
那么没有一种与驱动程序无关的方式可以更改主键的大小吗? - s1gtrap
为什么要包含文本的屏幕截图,而不是将文本粘贴(并链接到文档),这样做更省力? - mu is too short
@muistooshort :: 我需要突出几个单词,所以我认为这样做会更好 - Shiva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接