Получение числа с указанием ошибки "вне диапазона для 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