FixtureBuilder excludes database-generated expression columns because Rails fixtures cannot insert explicit values for them. PostgreSQL GENERATED ALWAYS AS IDENTITY columns have a similar constraint, but require a separate investigation.
Active Record exposes PostgreSQL identity metadata through column.identity?:
"a" — GENERATED ALWAYS AS IDENTITY
"d" — GENERATED BY DEFAULT AS IDENTITY
An ordinary PostgreSQL INSERT may supply an explicit value for BY DEFAULT, but rejects one for ALWAYS unless it uses OVERRIDING SYSTEM VALUE.
Rails’ fixture insertion currently excludes virtual? generated-expression columns but does not distinguish identity columns or add OVERRIDING SYSTEM VALUE. Therefore, a FixtureBuilder snapshot containing an explicit GENERATED ALWAYS AS IDENTITY value may fail while Rails loads it.
Investigation
FixtureBuilder excludes database-generated expression columns because Rails fixtures cannot insert explicit values for them. PostgreSQL
GENERATED ALWAYS AS IDENTITYcolumns have a similar constraint, but require a separate investigation.Active Record exposes PostgreSQL identity metadata through
column.identity?:"a"—GENERATED ALWAYS AS IDENTITY"d"—GENERATED BY DEFAULT AS IDENTITYAn ordinary PostgreSQL
INSERTmay supply an explicit value forBY DEFAULT, but rejects one forALWAYSunless it usesOVERRIDING SYSTEM VALUE.Rails’ fixture insertion currently excludes
virtual?generated-expression columns but does not distinguish identity columns or addOVERRIDING SYSTEM VALUE. Therefore, a FixtureBuilder snapshot containing an explicitGENERATED ALWAYS AS IDENTITYvalue may fail while Rails loads it.Investigation
GENERATED ALWAYS AS IDENTITY.column.identity? == "a"columns; retain serial, autoincrement, andGENERATED BY DEFAULT AS IDENTITYvalues.