Цейво!Всі публікаціїКатегоріїПро проєктДопомогти Україні 🇺🇦

Що означає помилка 'is out of range' в Ruby on Rails? Range Error - Integer with limit 4 bytes

Обкладинка допису: Що означає помилка 'is out of range' в Ruby on Rails? Range Error - Integer with limit 4 bytes
RangeError помилку можна побачити у Ruby on Rails після спроби запису занадто великого (або малого) числа до бази даних. Помилка може виглядати ось так:
999999999999999999999999999999999999999 is out of range for ActiveModel::Type::Integer with limit 4 bytes
або 
999999999999999999999999999999999999999 is out of range for ActiveRecord::Type::Integer with limit 4
Це означає, що ми намагаємось запхати у базу щось поза дозволеного діапазону.
Для чисел в базі даних ми можемо використовувати типи даних int та bigint. І кожен з цих типів має свої обмеження. Про це я вже писав в дописі про різницю між int та bigint.
Продублюю і тут:
  • Int може мати значення між -2147483648 та 2147483647.
  • Bigint між -9223372036854775808 та 9223372036854775807.
Тобто це фіксовані архітектурою ліміти int (32-бітове число) та bigint (64-бітове число).
Помилку можна вирішити використовуючи числа в цих діапазонах. Іноді ця помилка виникає при тестуванні інпутів на фронтенді. QA вписує велике число в поле і ми отримуємо RangeError. Це зазвичай фікситься додаванням валідацій та лімітів (як на стороні fe так і на be).
А щож робити якщо це id моделі і нам потрібно більший діапазон можливих значень? Варіантів насправді декілька.
  • Перехід від ID до UUID (Universally Unique Identifier). Варіацій реалізації може бути доволі багато. І залежить від стека і скопупів.
  • Розподіл бази даних на кластери. Тут теж варіацій реалізацій доволі багато. Але умовно - кожен кластер (shard) буде мати префікс та свій діапазон bigint.
  • В великих системах можна побачити композиційні ключі, які створюються з декількох різних колонок. Але це також специфічний варіант, реалізація якого залежить від багатьох факторів.

Цей допис поки що не має жодних доповнень від автора/ки.

В чому різниця між immediate value та reference у Ruby?
29 трав., 12:00

В чому різниця між immediate value та reference у Ruby?

meme code
meme code@memecode
Чому Ruby код повертає nil після виконання puts?
29 трав., 20:30

Чому Ruby код повертає nil після виконання puts?

meme code
meme code@memecode
Яка різниця між nil і false в Ruby?
29 трав., 20:59

Яка різниця між nil і false в Ruby?

meme code
meme code@memecode
Чому порожній рядок (string) у Ruby не є false?
31 трав., 14:39

Чому порожній рядок (string) у Ruby не є false?

meme code
meme code@memecode
Область видимості локальної змінної в Ruby
03 черв., 16:46

Область видимості локальної змінної в Ruby

meme code
meme code@memecode
Чим відрізняється int та bigint в Ruby? Мінімальні та максимальні значення.
13 черв., 06:37

Чим відрізняється int та bigint в Ruby? Мінімальні та максимальні значення.

meme code
meme code@memecode
Що таке імутабільність та мутабільність?
19 черв., 07:48

Що таке імутабільність та мутабільність?

meme code
meme code@memecode
[Ruby] Що повернеться в результаті складання 10.5 та 10?
23 черв., 13:23

[Ruby] Що повернеться в результаті складання 10.5 та 10?

meme code
meme code@memecode
[Ruby] Чим відрізняються змінні, що починаються з @, @@ та $?
23 черв., 14:00

[Ruby] Чим відрізняються змінні, що починаються з @, @@ та $?

meme code
meme code@memecode
Що таке функція в програмуванні?
24 черв., 18:15

Що таке функція в програмуванні?

meme code
meme code@memecode
[Фікс] extconf.rb failed під час встановлення Ruby-бібліотеки Gosu
27 черв., 16:38

[Фікс] extconf.rb failed під час встановлення Ruby-бібліотеки Gosu

meme code
meme code@memecode
Як зробити пустий git commit?
28 черв., 08:33

Як зробити пустий git commit?

meme code
meme code@memecode