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