2015-04-09 2 views
16

Ich benutze SQLite + ActiveRecord in meiner Ruby-App, und hier ist der Fehler ich bekomme beim Versuch, eine große Zahl an das Integer-Feld zu schreiben:Fehler-Anzeige-Nummer ist "out of range für ActiveRecord :: Type :: Integer mit Limit 4" beim Versuch, große (ish) Ganzzahl Wert

1428584647765 außerhalb des zulässigen Bereichs für Activerecord :: Type :: Integer mit Grenze 4

Aber nach der SQLite-Dokumentation:

Der Wert ist eine Ganzzahl mit Vorzeichen, die in 1, 2, 3, 4, 6 oder 8 Byte gespeichert wird, abhängig von der Größe des Werts.

8 Bytes ist eine viel Platz die ganze Zahl 1428584647765, zu speichern, so warum Active mir ein Fehler geben? Warum denkt es, dass dies ein 4-Byte-Feld ist?

+0

Der erste Link auf googeln „Active :: Type :: Integer mit Limit“ gibt [die Referenz] (https: // GitHub.com/henrik/rails/commit/1be562db9501007bd82d9385ffc8ca59e23daba9). – mudasobwa

Antwort

13

Guten Tag. standardmäßig columnt mit len ​​= 32 Byte erstellen

für Änderung dieser, können Sie die Migration, zum Beispiel erstellen:

t.integer :some_field, :limit => 8 
+1

Danke! Gibt es eine Möglichkeit, die Integer-Grenze zu ändern, ohne Migrationen zu verwenden? – Sergey

+1

Kannst du die Situation detaillierter erzählen? Migration - Standart Weg für patternd ORM ... Wenn Sie ein Problem haben - bitte beschreiben Sie – diderevyagin

+2

@Sergey change_column [: Tabellenname], [: column_name],: ganze Zahl, Limit: 20 – Philip

16

ich in das gleiche Problem lief, und die Antwort oben gab mir eine Ahnung, wie Ich habe meinen repariert. Ich schlage meine Antwort ein wenig detailliert vor, um das Problem zu lösen.

Sie können dies tun, indem Sie den Grenzwert für Ihre Tabellenspalte festlegen.

Hack/Steps

  1. eine Migration Führen Sie auf Ihre Tabellenspalte zu ändern. z.B.

    rails generate migration change_integer_limit_in_your_table

    Hinweis: your_table im Code wird Ihre Tabellennamen

  2. bearbeiten die erzeugte Migration in mehreren sein, so dass die erzeugte Migration wird wie folgt aussehen:

    class ChangeIntegerLimitInYourTable < ActiveRecord::Migration 
        def change 
        change_column :your_table, :your_column, :integer, limit: 8 
        end 
    end 
    

    Hinweis: Das Limit von 8 im Code ist die Speichergröße, die von -9223372036 reichen kann 854775808 bis +9223372036854775807 und genannt bigint, d. H. Eine Ganzzahl mit einem großen Bereich.

  3. Führen Sie rake db:migrate aus, um Ihre Datenbank zu migrieren.

  4. Starten Sie den Server neu, indem Sie rails server ausführen, und Sie sind betriebsbereit.

Weitere Informationen zu numerischem Typ, siehe https://www.postgresql.org/docs/9.4/static/datatype-numeric.html

Verwandte Themen