У Ruby існує лише один тип цілих чисел — Integer. У попередніх версіях Ruby були окремі класи для цілих чисел різних розмірів, такі як Fixnum для малих цілих чисел і Bignum для великих цілих чисел. Починаючи з версії Ruby 2.4, ці класи були об'єднані в єдиний клас Integer.
У Ruby немає поділу на int та bigint, як у базах даних. Єдиний клас Integer може представляти як малі, так і великі цілі числа. Ця особливість дозволяє Ruby без проблем працювати з будь-якими цілими числами, незалежно від їх розміру.
13.class
=> Integer
9223372036854775808.class
=> Integer
Однак, у контексті баз даних, таких як PostgreSQL, ми часто зустрічаємо типи даних
int та
bigint, які представляють собою 32-бітові та 64-бітові цілі числа відповідно. У Ruby ми можемо працювати з будь-яким з цих типів даних, але необхідно розуміти, як вони відрізняються в базі даних та як Ruby поводиться з великими числами.
Різниця між int та bigint
Якщо спростити -
bigint може мати більше максимально ціле число. Тобто якщо пхати занадто велике число в int - ми отримаємо помилку. Для цього нам потрібен тип даних, який може приймати більше значення. Це корисно в контексті великих баз даних. Якщо ви знаєте що база буде велика - використовуйте bigint. Інакше в якийсь момент вам доведеться писати міграції з int у bigint (
технічний борг буде накопичуватись, цього можно уникнути, знаючи приблизний / потенційний масштаб бази даних).
Мінімальні та максимальні значення int та bigint
Окєй. Давайте порахуємо максимальні числа, які можуть мати int та bigint:
# Мінімальне і максимальне значення для int (32-бітове ціле число)
min_int = -2**31
max_int = 2**31 - 1
puts "Min int: #{min_int}, Max int: #{max_int}"
Min int: -2147483648, Max int: 2147483647
# Мінімальне і максимальне значення для bigint (64-бітове ціле число)
min_bigint = -2**63
max_bigint = 2**63 - 1
puts "Min bigint: #{min_bigint}, Max bigint: #{max_bigint}"
Min bigint: -9223372036854775808, Max bigint: 9223372036854775807
Якщо додавати більше або менше число за ці діапазони - ми отримаємо помилку SQL:
ERROR: integer out of range # для int
ERROR: bigint out of range # для bigint