Rails и postgresql не поддерживают диалог при создании записи - PullRequest
2 голосов
/ 13 марта 2020

Сбой создания следующей записи, поскольку данные неверно интерпретируются 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); непосредственно выявит расхождение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...