Ответ 1
Попробуйте
t.column :number, :bigint
Смотри: Миграция Rails: похоже, что Bigint на PostgreSQL не работает?
У меня есть модель Number
, в которой поле number
является bigint
. Файл schema.rb
правильно создает структуру таблицы в базе данных.
Однако, используя приложение, когда я иду, чтобы создать новый номер, я получаю сообщение об ошибке:
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
Обновление 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 в базе данных до сих пор. Мои надежды были высоки. К сожалению, сигар нет. Та же ошибка при сохранении значения.
Попробуйте
t.column :number, :bigint
Смотри: Миграция Rails: похоже, что Bigint на PostgreSQL не работает?