Ta treść została automatycznie przetłumaczona z ukraińskiego.
Błąd RangeError można zobaczyć w Ruby on Rails po próbie zapisania zbyt dużej (lub zbyt małej) liczby do bazy danych. Błąd może wyglądać tak:
999999999999999999999999999999999999999 jest poza zakresem dla ActiveModel::Type::Integer z limitem 4 bajtów lub 999999999999999999999999999999999999999 jest poza zakresem dla ActiveRecord::Type::Integer z limitem 4
Oznacza to, że próbujemy włożyć do bazy coś poza dozwolonym zakresem.
Dla liczb w bazie danych możemy używać typów danych int oraz bigint. I każdy z tych typów ma swoje ograniczenia. O tym już pisałem w poście o różnicy między int a bigint.
Powtórzę to tutaj:
- Int może mieć wartości między -2147483648 a 2147483647.
- Bigint między -9223372036854775808 a 9223372036854775807.
To znaczy, że to stałe limity architektury int (liczba 32-bitowa) oraz bigint (liczba 64-bitowa).
Błąd można rozwiązać, używając liczb w tych zakresach. Czasami ten błąd pojawia się podczas testowania wejść na froncie. QA wpisuje dużą liczbę w pole i otrzymujemy RangeError. Zwykle naprawia się to poprzez dodanie walidacji i limitów (zarówno po stronie frontu, jak i backendu).
A co zrobić, jeśli to id modelu i potrzebujemy większego zakresu możliwych wartości? Opcji jest tak naprawdę kilka.
- Przejście od ID do UUID (Uniwersalny Unikalny Identyfikator). Wariantów realizacji może być naprawdę wiele. I zależy to od stosu i skopów.
- Podział bazy danych na klastry. Tutaj też wariantów realizacji jest dość dużo. Ale umownie - każdy klaster (shard) będzie miał prefiks i swój zakres bigint.
- W dużych systemach można zobaczyć klucze kompozytowe, które są tworzone z kilku różnych kolumn. Ale to również specyficzna opcja, której realizacja zależy od wielu czynników.
Ten post nie ma jeszcze żadnych dodatków od autora.