2015-10-25 12 views
6

Ich muss eine Tabelle von Benutzern indizieren, die eine extern sourced ID verwenden, die eine 64-Bit-Ganzzahl ist. Rails ist perfekt in der Lage, eine solche Nummer zu speichern, es sei denn, es handelt sich um den Primärschlüssel. Ich habe die folgende Migration:Ruby on Rails ignorieren ganzzahlige Grenze

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 

Die Migration funktioniert gut, keine Fehler gemeldet, aber wenn ich Samen versuchen, es mit einem 64-Bit-Integer, ich bin durch diese abgezählt:

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

Offensichtlich ignoriert Rails das Limit-Feld, solange es der Primärschlüssel/das: ID-Feld ist? Wie soll ich damit umgehen?

Für was es wert ist, verwende ich sqlite3 (Standard), aber meines Wissens ist sqlite perfekt in der Lage, 64-Bit-Ganzzahlen zu speichern.

Hier ist der table_info von SQLite:

0|id|integer(8)|0||0 
1|name|varchar|0||0 
2|created_at|datetime|1||0 
3|updated_at|datetime|1||0 
+1

Sind Sie sicher, das ist kein Problem SQLite? http://jakegoulding.com/blog/2011/02/06/sqlite-64-bit-integers/ –

+0

@CristianoBetta Ich glaube nicht, ich habe versucht, eine andere Spalte mit den gleichen Spezifikationen unter einem anderen Namen hinzufügen, die gut funktionierte . Entsprechend dem Pragma table_info werden beide auf die gleiche Weise definiert. – Will

+0

Ich habe ein ähnliches Problem auf PostgreSQL. Die Datenbank gibt an, dass die Spalte "bigint" ist und die Spaltenmetadaten das Limit von 8 angeben, aber ich erhalte den Fehler "out of range für ActiveModel :: Type :: Integer with limit 4" –

Antwort

3

Der Grenzwert haben Sie korrekt ist; es entspricht BIGINT type enter image description here Stellen Sie sicher, dass Ihre Migration angewendet wird; Öffnen Sie Datenbank in einigen CLI oder GUI-Software und überprüfen Sie die col-Typ

Zusatz: Ändern einer Spalte Länge oder Datentyp in einer Migration die Spalte als Primärschlüssel wird ungültig. Vielmehr Schaffung eines initializer, die die Website der Standardprimärschlüssel-Datentyp überschreibt sollte das Verhalten bieten Sie suchen zu implementieren:

# 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" 

Dies ist, was wir für PG Datenbank tun würde; Dies ist möglich, weil die

enter image description here


jedoch in der Codebasis von SQLite es

ist Ihr

enter image description here

+1

Ich habe die Datenbank entfernt und die Migration, versucht, es zu säen, und der Fehler bleibt. sqlite zeigt das korrekte und erwartete Limit an. – Will

+0

Also gibt es keine treiber-agnostische Möglichkeit, die Größe des Primärschlüssels zu ändern? – Will

+0

Warum Screenshots von Text einfügen, wenn Sie mit weniger Aufwand in den Text eingefügt (und mit [der Dokumentation] verknüpft werden könnten (http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SQLite3Adapter.html))? –