ruby on rails - example - El adaptador de rieles de Postgres piensa que Bigint/Varchar es Integer-causa una excepción al guardar
rails jsonb (2)
Tratar
t.column :number, :bigint
Ver: Migración de Rails: Bigint en PostgreSQL parece estar fallando?
Actualización: Esto se refiere a Rails 4.x y no es un problema en Rails 5.
Tengo un modelo number
que es un campo number
que es un bigint
. El archivo schema.rb
crea correctamente la estructura de la tabla en la base de datos.
Sin embargo, al usar la aplicación, cuando voy a crear un nuevo Número, aparece un error que dice:
RangeError en / numbers
71731224865 está fuera de rango para ActiveRecord :: ConnectionAdapters :: PostgreSQL :: OID :: Integer with limit 4
¿Por qué este campo numérico sigue siendo tratado como un entero estándar en lugar de un bigint?
Esto parece diferente a los otros errores "fuera de rango" en StackOverflow, ya que todos parecen no ser capaces de obtener el campo definido como bigint en la base de datos en primer lugar. Sin embargo, tengo que ... esto parece estar "guardado" porque el adaptador se está volviendo loco.
Aquí está el create_table como aparece en 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
Actualización 1: he recreado la columna como DECIMAL(11,0)
con la esperanza de que fuera una solución temporal, sin embargo, ¡ eso también falló con el mismo error ! Tal vez la única opción que tengo como solución es VARCHAR (11).
Actualización 2: Ok. Algo raro está sucediendo. He definido el campo ahora como VARCHAR(11)
así que puedo seguir progresando con el trabajo ... pero eso también falla con el mismo error. ¿Que?
Actualización 3: ¿Podría ser porque el campo de number
en la tabla de numbers
es la clave principal? No estoy usando una id
como la clave, la he anulado. No es que esté intentando usar el campo como VARCHAR, no tiene sentido por qué el PostgreSQLAdaptor todavía se está mostrando ... is out of range for ActiveRecord::ConnectionAdapters::PostgreSQL::OID::Integer with limit 4
error.
Aquí está mi modelo Number
si ayuda:
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
Actualización 4: uso de la consola Rails para ver qué tipo de datos cree que son las columnas , ¡y dice INTEGER! Grr. sql_type
devuelve BIGINT sin embargo. ¿Que?
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
Asegurándose de que la base de datos sigue configurada como se esperaba
[turgs@web123 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=>
Actualización 5: Sí .... otra actualización! Esta vez pensé que caería en mi espada y probaría lo que todos usan en las otras publicaciones donde no pueden obtener el BIGINT para crear en la base de datos en primer lugar. Entonces, cambié por schema.rb
a:
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
Tenga en cuenta el t.integer "number", limit: 8
. Sorprendentemente, ese DID todavía crea un campo bigint en la base de datos. Mis esperanzas eran altas. Desafortunadamente, no hay cigarros. Mismo error al guardar valor.
create_table :numbers do |t|
t.bigint :mynumber
t.timestamps
end
He intentado con la migración anterior que funciona para la siguiente longitud de número
7173122486511111111
Creo que hay un problema con la versión, por favor actualice su versión de postgres / rails