rails postgres example column ruby-on-rails postgresql activerecord

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