To trochę długa odpowiedź, więc podzieliłem ją na sekcje. Zapnij pasy!
Moja teoria
Domyślam się, że Twoja programistyczna baza danych tak zawierać lessons_id_seq
i że jego definicja flightlessons.id
jest ustawiony tak, aby od niego zależeć (tj. dokładnie to, co Railsy umieszczają w twoim pliku schematu).
Jak i dlaczego? Prawdopodobnie zmieniłeś nazwę lessons
tabela do lessons
w pewnym momencie w przeszłości, ale ta zmiana nazwy nie zmieniła kolejności, od której zależała tabela -- i odkąd schema.rb
czy nie sekwencje rekordów, lessons_id_seq
sekwencja nie jest kopiowana do testowej bazy danych, dlatego pojawia się ten błąd.
Aby zweryfikować moją teorię, uruchom rails db
i wypróbuj następujące polecenia:
\d lessons_id_seq
Powinno to zwrócić definicję tej sekwencji. Następnie spróbuj:
\d flightlessons
I spójrz na definicję id
kolumna. Oczekuję, że będzie zawierać DEFAULT nextval('lessons_id_seq')
.
Poprawki
Najprostszym sposobem, aby to naprawić, jest przejście na structure.sql
zamiast schema.rb
(zobacz dokumentację
). Przeniesie to dokładny stan Twojej bazy danych i uniknie jakichkolwiek zakłóceń lub interpretacji przez Railsy, co jest przyczyną Twojego obecnego problemu. Zawsze polecam structure.sql
dla systemów produkcyjnych.
Możesz jednak również wejść do swojej bazy danych rozwoju i zmienić nazwę sekwencji:
ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');
To byłby okropny pomysł w systemie produkcyjnym, ale jeśli problem jest tylko lokalny, powinien poprawić aktualny stan bazy danych za pomocą schema.rb
i w ten sposób rozwiązać swój obecny problem. Możesz zakodować to w migracji, jeśli chcesz rails db:drop db:create db:migrate
pracować nad nową aplikacją.
Dlaczego teraz?
Zachowanie, w którym Railsy wyrzucają default
wartość klucza podstawowego twojej tabeli może być całkiem nowa w Rails 5. Wcześniej Railsy mogły po prostu wierzyć, że twoja kolumna ID ma rozsądną wartość domyślną i ignorować jakąkolwiek wartość, którą faktycznie widziały. Ale nie przeprowadziłem badań, aby sprawdzić, czy to prawda, czy nie.