Ruby on Rails忽略整数限制

Wil*_*ill 6 ruby sqlite ruby-on-rails

我需要使用外部源id(一个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
Run Code Online (Sandbox Code Playgroud)

迁移工作正常,没有报告错误,但当我尝试使用64位整数播种时,我被告知:

RangeError: 76561198054432981 is out of range for ActiveRecord::Type::Integer with limit 4
Run Code Online (Sandbox Code Playgroud)

显然Rails忽略了限制字段,只要它是主键/: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
Run Code Online (Sandbox Code Playgroud)

ill*_*ist 4

您给出的极限值是正确的;它对应于BIGINT类型 在此输入图像描述 确保您的迁移已应用;在某些 CLI 或 GUI 软件中打开数据库并验证 col-type

添加: 在迁移中更改列的长度或数据类型将使该列作为主键失效。相反,创建一个覆盖站点默认主键数据类型的初始值设定项应该提供您要实现的行为:

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

这就是我们对数据库要做的事情PG;这是可能的,因为

在此输入图像描述


但是在代码库中SQLite

在此输入图像描述