Ruby on Rails忽略整数限制

时间:2015-10-25 02:35:15

标签: ruby-on-rails ruby sqlite

我需要使用外部源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

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

RangeError: 76561198054432981 is out of range for ActiveRecord::Type::Integer with limit 4

显然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

1 个答案:

答案 0 :(得分:3)

您提供的限制值是正确的;它对应于BIGINT类型 enter image description here 确保您的迁移已应用;在某些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"

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

enter image description here

但是在SQLite的代码库中有

enter image description here