Postgres Rails Adapter думает, что Bigint/Varchar является целочисленным - вызывает исключение при сохранении

У меня есть модель Number, в которой поле number является bigint. Файл schema.rb правильно создает структуру таблицы в базе данных.

Postgres numbers schema

Однако, используя приложение, когда я иду, чтобы создать новый номер, я получаю сообщение об ошибке:

RangeError at/numbers
71731224865 находится вне диапазона для ActiveRecord :: ConnectionAdapters :: PostgreSQL :: OID :: Integer с пределом 4

Почему это числовое поле все еще рассматривается как стандартное целое число, а не как bigint?

Похоже, это отличается от других ошибок "вне диапазона" в Qaru, так как все они, похоже, не могут получить поле, определенное как bigint в базе данных. Тем не менее, у меня есть это.. это, кажется, "при сохранении" адаптер выходит из строя.

Здесь create_table, как это выглядит в schema.rb:

create_table "numbers", id: false, force: :cascade do |t|
  t.bigint   "number",           null: false, index: {name: "index_numbers_on_number", unique: true}
  t.string   "formatted_number"
  t.text     "description"
  t.integer  "user_id",          null: false, index: {name: "index_numbers_on_userid"}, foreign_key: {name: 'fk_numbers_user_id'}
  t.datetime "created_at",       null: false
  t.datetime "updated_at",       null: false
end

Create number image
Stacktrace

Обновление 1: Я заново создал столбец как DECIMAL(11,0) в надежде, что это будет временное решение, однако это тоже не удалось с той же ошибкой! Возможно, единственный вариант, который я выбрал в качестве обходного пути, - это VARCHAR (11).

Обновление 2: Хорошо. Что-то странное происходит. Я определил поле сейчас как VARCHAR(11), чтобы я мог продолжать работу... но это тоже не получается с той же ошибкой. Что за?

Обновление 3: Может ли это быть потому, что поле number в таблице numbers является первичным ключом? Я не использую id в качестве ключа, я переопределил его. Не то, чтобы я пытался использовать это поле в качестве VARCHAR, нет смысла, почему PostgreSQLAdaptor все еще показывает ошибку ... is out of range for ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer with limit 4.

Вот моя модель Number, если она помогает:

class Number < AbstractModel
  belongs_to :user
  has_many :extensions

  self.primary_key = 'number'
  validates :number, numericality: { only_integer: true, greater_than_or_equal_to: 611, less_than_or_equal_to: 61999999999 }, presence: true, uniqueness: true
  validates :user_id, presence: true
end

Обновление 4: Используя консоль Rails, посмотрите, какой тип данных он считает столбцами, и он говорит INTEGER! Grr. sql_type возвращает BIGINT. Что за?

Loading development environment (Rails 4.2.1)
irb(main):001:0> Number.column_for_attribute('number').type
  => :integer
irb(main):002:0> Number.column_for_attribute('number').sql_type
  => "bigint"
irb(main):003:0> quit

Убедитесь, что БД по-прежнему настроена должным образом:

[[email protected] myapp]$ psql -h 127.0.0.1 -p 5432
psql (9.1.15)

db=> \d numbers
                   Table "public.numbers"
      Column      |            Type             | Modifiers 
------------------+-----------------------------+-----------
 number           | bigint                      | not null
 formatted_number | character varying           | 
 description      | text                        | 
 user_id          | integer                     | not null
 max_extn_length  | integer                     | 
 created_at       | timestamp without time zone | not null
 updated_at       | timestamp without time zone | not null
Indexes:
    "index_numbers_on_number" UNIQUE, btree (number)
    "index_numbers_on_userid" btree (user_id)
Referenced by:
    TABLE "extensions" CONSTRAINT "fk_extensions_number_id" FOREIGN KEY (number_id) REFERENCES numbers(number)

db=> 

Обновление 5: Да.... еще одно обновление! На этот раз я думал, что упаду на свой меч и попробую то, что все используют в других постах, где они не могут получить BIGINT для создания в базе данных. Итак, я изменил schema.rb на:

    create_table "numbers", id: false, force: :cascade do |t|
  t.integer  "number", limit: 8, null: false, index: {name: "index_numbers_on_number", unique: true}
  t.string   "formatted_number"
  t.text     "description"
  t.integer  "user_id", null: false, index: {name: "index_numbers_on_userid"}, foreign_key: {name: 'fk_numbers_user_id'}
  t.integer  "max_extn_length"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

Обратите внимание на t.integer "number", limit: 8. Удивительно, что DID создал поле bigint в базе данных до сих пор. Мои надежды были высоки. К сожалению, сигар нет. Та же ошибка при сохранении значения.

Ответы