Questa è una risposta un po' lunga, quindi l'ho suddivisa in sezioni. Allaccia le cinture!
La mia teoria
La mia ipotesi è che il tuo database di sviluppo fa contengono il lessons_id_seq
sequenza e che la sua definizione di flightlessons.id
è impostato per dipendere da esso (ovvero, esattamente ciò che Rails sta inserendo nel file dello schema).
Come e perché? Probabilmente hai rinominato le lessons
tabella a flightlessons
ad un certo punto in passato, ma quella ridenominazione non ha cambiato la sequenza da cui dipendeva la tabella -- e poiché schema.rb
non sequenze di record, il lessons_id_seq
la sequenza non viene copiata nel database di test e quindi viene visualizzato questo errore.
Per verificare la mia teoria, esegui rails db
e prova i seguenti comandi:
\d lessons_id_seq
Questo dovrebbe restituire la definizione di quella sequenza. Quindi, prova:
\d flightlessons
E guarda la definizione di id
colonna. Mi aspetto che includa DEFAULT nextval('lessons_id_seq')
.
Correzioni
Il modo più semplice per risolvere questo problema è passare all'utilizzo di structure.sql
invece di schema.rb
(vedi i documenti
). Ciò manterrà lo stato esatto del tuo database ed eviterà qualsiasi interferenza o interpretazione da parte di Rails, che è ciò che sta causando il tuo problema attuale. Consiglio sempre structure.sql
per sistemi di produzione.
Tuttavia, puoi anche accedere al tuo database di sviluppo e modificare il nome della sequenza:
ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');
Questa sarebbe una pessima idea su un sistema di produzione, ma se il tuo problema è solo locale, dovrebbe correggere lo stato del tuo database attuale con il tuo schema.rb
e quindi affrontare il tuo problema attuale. Potresti voler codificarlo in una migrazione, se vuoi rails db:drop db:create db:migrate
per lavorare su una nuova app.
Perché adesso?
Il comportamento in cui Rails sta scaricando il default
il valore per la chiave primaria della tua tabella potrebbe benissimo essere nuovo in Rails 5. In precedenza, Rails potrebbe essersi semplicemente fidato del fatto che la tua colonna ID avesse un valore predefinito sano e ignorato qualunque valore effettivamente vedesse. Ma non ho fatto la ricerca per vedere se è vero o no.