2015-10-25 8 views
6

64ビット整数である外部ソースIDを使用してユーザのテーブルを索引付けする必要があります。 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ビットの整数を格納できます。

は、ここでの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のコードベースであるためしかし

enter image description here


可能であるあなたは、これは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 for limit 4のエラーを受け取りました。 –

答えて

3

限界値は正しいです。 BIGINTタイプに対応 enter image description here 移行が適用されていることを確認してください。あなたにいくつかのCLIまたはGUIソフトウェアのデータベースを開き、COL型

追加検証: は、移行中に、列の長さまたはデータ型を変更するには、主キーとして列が無効になりますが。むしろ、サイトのデフォルトの主キーのデータ型は、あなたが実装するために探している動作を提供すべきであるよりも優先されます初期化子作成:

# 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

+1

データベースを削除しました。それをシードしようとしましたが、エラーは残ります。 sqliteは正しいと期待される:制限を示します。 – Will

+0

プライマリキーのサイズを変更するドライバに依存しない方法はありませんか? – Will

+0

テキストを貼り付けることができたとき(なぜ[ドキュメンテーション](http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SQLite3Adapter.html)にリンクされている)のスクリーンショットを少ない労力で含めるのはなぜですか? –

関連する問題