Đây là một câu trả lời hơi dài, vì vậy tôi đã chia nó thành nhiều phần. Thắt dây an toàn!
Lý thuyết của tôi
Tôi đoán là cơ sở dữ liệu phát triển của bạn không chứa lessons_id_seq
trình tự và định nghĩa của nó về flightlessons.id
được đặt để phụ thuộc vào nó (tức là chính xác những gì Rails đang đưa vào tệp lược đồ của bạn).
Như thế nào và tại sao? Bạn có thể đã đổi tên lessons
bảng tới flightlessons
tại một thời điểm nào đó trong quá khứ, nhưng việc đổi tên đó không thay đổi trình tự mà bảng phụ thuộc vào - và kể từ schema.rb
không ghi lại các chuỗi, lessons_id_seq
trình tự không được sao chép vào cơ sở dữ liệu thử nghiệm của bạn và do đó bạn gặp lỗi này.
Để xác minh lý thuyết của tôi, hãy chạy rails db
và thử các lệnh sau:
\d lessons_id_seq
Điều này sẽ trả về định nghĩa của chuỗi đó. Sau đó, hãy thử:
\d flightlessons
Và nhìn vào định nghĩa của id
cột. Tôi hy vọng nó sẽ bao gồm DEFAULT nextval('lessons_id_seq')
.
Bản sửa lỗi
Cách dễ nhất để khắc phục điều này là chuyển sang sử dụng structure.sql
thay vì schema.rb
(xem tài liệu
). Điều này sẽ chuyển trạng thái chính xác của cơ sở dữ liệu của bạn và tránh bất kỳ sự can thiệp hoặc giải thích nào của Rails, đó là nguyên nhân gây ra sự cố hiện tại của bạn. Tôi luôn khuyên bạn nên sử dụng structure.sql
cho hệ thống sản xuất.
Tuy nhiên, bạn cũng có thể vào cơ sở dữ liệu phát triển của mình và thay đổi tên trình tự:
ALTER SEQUENCE lessons_id_seq RENAME TO flightlessons_id_seq;
ALTER TABLE flightlessons ALTER COLUMN id SET DEFAULT nextval('flightlessons_id_seq');
Đây sẽ là một ý tưởng tồi trên hệ thống sản xuất, nhưng nếu sự cố của bạn chỉ là cục bộ, nó sẽ sửa lại trạng thái cơ sở dữ liệu hiện tại của bạn bằng schema.rb
và do đó giải quyết vấn đề hiện tại của bạn. Bạn có thể muốn mã hóa nó thành một quá trình di chuyển, nếu bạn muốn rails db:drop db:create db:migrate
để làm việc trên một ứng dụng mới.
Tại sao lại là bây giờ?
Hành vi mà Rails đang giải phóng default
giá trị cho khóa chính của bảng của bạn rất có thể là mới trong Rails 5. Trước đây, Rails có thể đã tin tưởng rằng cột ID của bạn có một mặc định lành mạnh và bỏ qua bất kỳ giá trị nào mà nó thực sự thấy. Nhưng tôi chưa thực hiện nghiên cứu để xem điều đó có đúng hay không.