2015-10-25 117 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))時加入文本的屏幕截圖,而不需要費力? –