Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
Der RangeError kann in Ruby on Rails auftreten, nachdem versucht wurde, eine zu große (oder zu kleine) Zahl in die Datenbank zu schreiben. Der Fehler kann so aussehen:
999999999999999999999999999999999999999 ist außerhalb des Bereichs für ActiveModel::Type::Integer mit einem Limit von 4 Bytes oder 999999999999999999999999999999999999999 ist außerhalb des Bereichs für ActiveRecord::Type::Integer mit einem Limit von 4
Das bedeutet, dass wir versuchen, etwas außerhalb des erlaubten Bereichs in die Datenbank zu stecken.
Für Zahlen in der Datenbank können wir die Datentypen int und bigint verwenden. Und jeder dieser Typen hat seine eigenen Einschränkungen. Darüber habe ich bereits in meinem Beitrag über den Unterschied zwischen int und bigint geschrieben.
Ich wiederhole es hier:
- Int kann Werte zwischen -2147483648 und 2147483647 haben.
- Bigint zwischen -9223372036854775808 und 9223372036854775807.
Das sind also die architekturbedingt festen Limits für int (32-Bit-Zahl) und bigint (64-Bit-Zahl).
Der Fehler kann behoben werden, indem Zahlen in diesen Bereichen verwendet werden. Manchmal tritt dieser Fehler beim Testen von Eingaben im Frontend auf. QA gibt eine große Zahl in das Feld ein und wir erhalten einen RangeError. Dies wird normalerweise durch das Hinzufügen von Validierungen und Limits (sowohl auf der Frontend- als auch auf der Backend-Seite) behoben.
Was ist jedoch zu tun, wenn es sich um die ID eines Modells handelt und wir einen größeren Bereich möglicher Werte benötigen? Es gibt tatsächlich mehrere Optionen.
- Der Übergang von ID zu UUID (Universally Unique Identifier). Es gibt viele Variationen der Implementierung, die von dem Stack und den Anforderungen abhängen.
- Die Aufteilung der Datenbank in Cluster. Auch hier gibt es viele Variationen der Implementierung. Aber grob gesagt wird jeder Cluster (Shard) ein Präfix und seinen eigenen Bereich von bigint haben.
- In großen Systemen kann man zusammengesetzte Schlüssel sehen, die aus mehreren verschiedenen Spalten erstellt werden. Aber das ist auch eine spezifische Variante, deren Implementierung von vielen Faktoren abhängt.
Dieser Beitrag hat noch keine Ergänzungen vom Autor.