Today I Learned

What to look for when your factory is missing id

So yesterday evening I’ve spotted a factory that was missing its _factory suffix. Easy peasy, quick rename and off we go… yes.. no… suddenly factories linting failed with following error

FactoryGirl::InvalidFactoryError:
  The following factories are invalid:

  * lockoff - PG::NotNullViolation: ERROR:  null value in column "id" violates not-null constraint
  DETAIL:  Failing row contains (null, null, null, {}, {}, null, null, 2018-06-13 20:20:02.606616, 2018-06-13 20:20:02.606616).
  : INSERT INTO "lockoffs" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id" (ActiveRecord::StatementInvalid)

null value in column "id" ? What? How? After checking absolutely everything reasonable, I’ve checked column definitions. It turned out, that during selecting changes for structure.sql, somebody forgot to add one important piece to commit, that was effectively preventing automatic generation of consecutive primary key values.

--
-- Name: lockoffs id; Type: DEFAULT; Schema: public; Owner: -
--

ALTER TABLE ONLY lockoffs ALTER COLUMN id SET DEFAULT nextval('lockoffs_id_seq'::regclass);

If you ever face similar issue, do not forget to look for something like that as well…