Що означає помилка 'is out of range' в Ruby on Rails? Range Error -
Дисклеймер

Інформація на сайті tseivo.com є суб'єктивною та відображає особисті погляди та досвід авторів та авторок блогів.

Використовуйте цей ресурс як одне з декількох джерел інформації під час своїх досліджень та прийняття рішень. Завжди застосовуйте критичне мислення. Людина сама несе відповідальність за свої рішення та дії.

Обкладинка нотатки: Що означає помилка '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.
  • В великих системах можна побачити композиційні ключі, які створюються з декількох різних колонок. Але це також специфічний варіант, реалізація якого залежить від багатьох факторів.

🙌 Підтримати блог @memecode

Ви можете поширити цей допис у соцмережах, чим допоможете платформі цейво розвиватись (* ^ ω ^)

📝 Більше публікацій: