2009-06-16 15 views
28

Einfache Schienen App mit Postgres DB, erhalten "Integer außerhalb des Bereichs" Fehler beim Versuch, 2176968859 einfügen. Sollte eine einfache Lösung für die Migrationen sein, aber ich bin mir nicht sicher. Im Moment habe ich ...Integer außerhalb des Bereichs auf Postgres DB

create_table :targets do |t| 
    t.integer :tid 
    ... 
end 

Antwort

1

Hinweis Der Bereich der zulässigen Werte für die Integer-Typ in http://www.postgresql.org/docs/8.3/interactive/datatype-numeric.html. Ich denke, dass Sie eine Bigint, Dezimal oder doppelte Genauigkeit verwenden müssen.

+0

nett, irgendeine Idee, wie ich die maximale Zahl für Integer programmatisch bekommen kann, so kann ich auf Null setzen, wenn jemand eine große Zahl eingibt? Ich benutze den PG-Edelstein in Schienen. – ryan2johnson9

+0

@ ryan2johnson9 nicht ohne weiteres, aber ich wette, eine andere Frage wird das beantworten; wenn nicht, frage einen neuen – ysth

1

PostgreSQL-Ganzzahlen sind signiert, es gibt keinen unsignierten Datentyp - ich wette, das ist dein Problem.

Wenn Sie größere Werte benötigen, verwenden Sie bigint. Wenn bigint auch nicht genug ist, benutze numeric - aber benutze Bigint statt numeric, es sei denn du brauchst die größere Größe oder Dezimalstellen, da es viel schneller ist.

56

Hier ist der Zauberspruch in der Migration, wenn Sie die Spalte deklarieren:

create_table :example do |t| 
    t.integer :field, :limit => 8 
end 

Das: limit => 8 ist die Magie in diesem Fall als Postgres nur 4-Byte-Integer unterzeichnet ist, wenn Sie gerade ganze Zahl sagen . Dies verwendet 8-Byte-Ganzzahlen mit Vorzeichen.

+0

Ich würde eher empfehlen, einen korrekten Datentyp im Feld der Tabelle zu ändern/einzustellen – StormByte

11

In Rails 4. In Ihrer Migrationsdatei, können Sie die Spalte als definieren:

t.column :foobar, :bigint 

Wie bereits in früheren Antworten erwähnt, limit: 8 erreichen wird auch die gleiche Sache

Verwandte Themen