2015-10-25 86 views
6

我需要使用外部源ID(64位整数)对用户表进行索引。 Rails完全有能力存储这样的数字,除非它是主键。我有以下迁移:Ruby on 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位整数。

下面是从源码的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/ –

+0

@CristianoBetta我不这么认为,我试着在不同的名字下使用相同的规格添加另一列, 。根据pragma table_info,两者都以相同的方式定义。 – Will

+0

我在PostgreSQL上有类似的问题。数据库指出该列是'bigint',列元数据指出了8的限制,但是我得到了超出范围的ActiveModel :: Type :: Integer的限制4的错误' –

回答

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显示正确的和预期的:限制。 – Will

+0

因此,没有与驱动程序无关的方法来更改主键的大小? – Will

+0

为什么在可以粘贴文本(并且链接到[文档](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SQLite3Adapter.html))时加入文本的屏幕截图,而不需要费力? –