Сбой создания следующей записи, поскольку данные неверно интерпретируются Postgresql
SQL (1.3ms) INSERT INTO "gruppomerceologicos" ("nome", "reparto_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id" [["nome", "Salumeria"], ["reparto_id", 1], ["created_at", "2020-03-13 09:24:15.529470"], ["updated_at", "2020-03-13 09:24:15.529470"]]
(0.2ms) ROLLBACK
Completed 500 Internal Server Error in 11ms (ActiveRecord: 2.5ms)
PG::NotNullViolation - ERROR: null value in column "id" violates not-null constraint
DETAIL: Failing row contains (null, Salumeria, 2020-03-13 09:24:15.52947, 2020-03-13 09:24:15.52947, 1).
Создание строки некорректно, так как PostgreSQL пытается обработать запись с null
значение для id
Стандартный контроллер
@gruppomerceologico = Gruppomerceologico.new(gruppomerceologico_params)
authorize @gruppomerceologico
@gruppomerceologico.save
respond_with(@gruppomerceologico)
Однако отладчик rails показывает, что пытается обработать запись без идентификатора в точке, где происходит ошибка
@gruppomerceologico
#<Gruppomerceologico id: nil, nome: "Salumeria", created_at: "2020-03-13 08:24:15", updated_at: "2020-03-13 08:24:15", reparto_id: 1>
Postgre имеет следующую структуру данных
Table "public.gruppomerceologicos"
Column | Type | Modifiers
------------+-----------------------------+-----------
id | integer | not null
nome | character varying |
created_at | timestamp without time zone | not null
updated_at | timestamp without time zone | not null
reparto_id | integer |
Indexes:
"gruppomerceologicos_pkey" PRIMARY KEY, btree (id)
"index_gruppomerceologicos_on_reparto_id" btree (reparto_id) Foreign-key constraints:
"fk_rails_d8a087054a" FOREIGN KEY (reparto_id) REFERENCES repartos(id) Referenced by:
TABLE "materiagrezzas" CONSTRAINT "fk_rails_2b6ca167a0" FOREIGN KEY (gruppomerceologico_id) REFERENCES gruppomerceologicos(id)
Обычно Postgre знает, что создает новую запись и, таким образом, назначает последовательный идентификатор и создает запись. Но этого не происходит. Где разрыв между рельсами и Postgresql?
Начальная миграция:
class CreateGruppomerceologicos < ActiveRecord::Migration
def change
create_table :gruppomerceologicos do |t|
t.string :nome
t.timestamps null: false
end
end
end
, за которой следует обновление в миграции
class AddRepartoToGruppomerceologicos < ActiveRecord::Migration
def change
add_reference :gruppomerceologicos, :reparto, index: true, foreign_key: true
end
end
Обновление Двойная проверка с сервером разработки, запрос \d
для таблицы возвращает что-то совершенно другое:
Table "public.gruppomerceologicos"
Column | Type | Collation | Nullable | Default
------------+-----------------------------+-----------+----------+-------------------------------------------------
id | integer | | not null | nextval('gruppomerceologicos_id_seq'::regclass)
nome | character varying | | |
created_at | timestamp without time zone | | not null |
updated_at | timestamp without time zone | | not null |
, где nextval
явно в правильной игре. Две базы данных были как-то не синхронизированы. Как предложено ниже @sebastianPalma, select nextval('gruppomerceologicos_id_seq'::regclass);
непосредственно выявит расхождение.