Dette er et lidt langt svar, så jeg har delt det op i sektioner. Spænd op!
Min teori
Mit gæt er, at din udviklingsdatabase gør indeholde lessons_id_seq
sekvens, og dets definition af flightlessons.id
er indstillet til at afhænge af det (dvs. præcis hvad Rails lægger i din skemafil).
Hvordan og hvorfor? Du har sandsynligvis omdøbt lessons
tabel til flightlessons
på et tidspunkt i fortiden, men det omdøbning ændrede ikke den rækkefølge, som tabellen var afhængig af -- og da schema.rb
gør ikke optagesekvenser, lessons_id_seq
sekvensen bliver ikke kopieret til din testdatabase, og dermed får du denne fejl.
For at bekræfte min teori skal du køre rails db
og prøv følgende kommandoer:
\d lessons_id_seq
Dette skulle returnere definitionen af den sekvens. Prøv derefter:
\d flightlessons
Og se på definitionen af id
kolonne. Jeg forventer, at den indeholder DEFAULT nextval('lessons_id_seq')
.
Rettelser
Den nemmeste måde at løse dette på er at skifte til at bruge structure.sql
i stedet for schema.rb
(se dokumenterne
). Dette vil overføre den nøjagtige tilstand af din database og undgå enhver interferens eller fortolkning fra Rails, hvilket er det, der forårsager dit aktuelle problem. Jeg anbefaler altid structure.sql
til produktionssystemer.
Du kan dog også gå ind i din udviklingsdatabase og ændre sekvensnavnet:
ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');
Dette ville være en frygtelig idé på et produktionssystem, men hvis dit problem kun er lokalt, bør det rette op på din nuværende databasetilstand med dit schema.rb
og dermed løse dit nuværende problem. Du ønsker måske at indkode det til en migrering, hvis du vil have rails db:drop db:create db:migrate
at arbejde på en ny app.
Hvorfor nu?
Den adfærd, hvor Rails dumper default
ud værdien for din tabels primære nøgle kan meget vel være ny i Rails 5. Tidligere har Rails måske bare stolet på, at din ID-kolonne havde en fornuftig standard, og ignoreret den værdi, den faktisk så. Men jeg har ikke lavet research for at se, om det er sandt eller ej.