Получение числа с указанием ошибки "вне диапазона для ActiveRecord:: Type:: Integer с ограничением 4" при попытке сохранить большое (ish) целочисленное значение
Я использую SQLite + ActiveRecord в моем приложении Ruby, и вот ошибка, которую я получаю, пытаясь написать большое число в целочисленное поле:
1428584647765 выходит за пределы диапазона для ActiveRecord:: Type:: Integer с предел 4
Но согласно документации SQLite:
Значение представляет собой целое число со знаком, сохраненное в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения.
8 байтов - это много места для хранения целого числа 1428584647765, поэтому почему ActiveRecord дает мне ошибку? Почему он считает, что это 4-байтовое поле?
Ответы
Ответ 1
Я столкнулся с той же проблемой, и приведенный выше ответ дал мне понять, как я исправил мою. Я предлагаю свой ответ немного подробно для решения проблемы.
Вы можете сделать это, установив ограничение в столбец таблицы.
Hack/Шаги
-
Запустите миграцию, чтобы изменить столбец таблицы. например.
rails generate migration change_integer_limit_in_your_table
Примечание: your_table
в коде будет ваше имя таблицы во множественном числе
-
Отредактируйте сгенерированную миграцию, чтобы сгенерированная миграция выглядела следующим образом:
class ChangeIntegerLimitInYourTable < ActiveRecord::Migration
def change
change_column :your_table, :your_column, :integer, limit: 8
end
end
Примечание. Предел 8 в коде - это размер хранилища, который может находиться в диапазоне от -9223372036854775808 до +9223372036854775807 и называется bigint
то есть целочисленным значением большого числа.
-
Запустите rake db:migrate
, чтобы перенести свою базу данных.
-
Перезагрузите сервер, запустив rails server
, и вы включились.
Для получения дополнительной информации о числовом типе см. https://www.postgresql.org/docs/9.4/static/datatype-numeric.html
Ответ 2
Добрый день.
По умолчанию columnt создает с len = 32 байта
чтобы изменить это, вы можете создать миграцию, например:
t.integer :some_field, :limit => 8
Ответ 3
Я столкнулся с этой проблемой сегодня и с PostgreSQL. Я знаю, что вопрос старый, и автор использовал SQLite, но так как многие люди оказываются здесь, как я, я позволил опубликовать обновленное решение.
Для Rails 5.1 (я полагаю, для 4.1 и выше, но не тестировал) и PostgreSQL (вероятно, с другими базами данных) правильный способ - установить тип столбца на bigint
, используя параметр limit: 8
, не влияющий на базу данных.
Это пример кода, использующего таблицу с именем products и столбец с количеством:
class ChangeProductsQuantityToBigint < ActiveRecord::Migration[5.1]
def change
change_column :products, :quantity, :bigint
end
end