seed_fuで初期データを導入しようと思ったらエラーがでた話

プログラミングを本格的にスタートして5ヶ月目に入りましたさかもとです。

今回は以前紹介したseed_fuを使い初期データを導入しようと思ったらファイルの配置ミスによってエラーが出てしまったので復習の意味も込めてアウトプットしたいと思います。

 

今回のエラー

 

rails db:seed_fu を実行すると

 

ActiveRecord::InvalidForeignKey: Mysql2::Error: Cannot add or update a child row: a foreign key constraint fails (`(アプリ名_development`.`first_answers`, CONSTRAINT `fk_rails_a064cfe5d3` FOREIGN KEY (`first_question_id`) REFERENCES `first_questions` (`id`))

 

このようなエラーが出てきました。

 

現状

 

db/fixtures/first_anser.rb

https://i.gyazo.com/c0e3f21cd306de99f708f1cbcf75d56f.png

 

db/fixtures/first_question.rb

https://i.gyazo.com/1d5f0f45930418fdf75f4bce72e4dd26.png

 

ファイルの配置状況

https://i.gyazo.com/74e640d147122ba1e1b598e9fa567218.png

 

思考

 

今回に関してはまずforeign_keyと書いてあるのでリレーションの外部キー制約がうまくいってないんだなと目星を付けました。

そこでファイルの中身をそれぞれみてみると記述に誤ったところやタイポなどは見当たりません。

そこでエラー文を検索してみます。すると下記記事を見つけました。

tech.mof-mof.co.jp

この中に答えがのっていました。是非解決にいく前にどこがおかしかったのか記事を読んで予測をしてみてください。

 

解決

 

結論から言うと、「ファイルの作成順」でした。

現状、fixturesファイルの中にfirst_answer.rbの下にfirst_question.rbがあります。

しかしリレーション的にはquestionが親でanswerが子なので先に親のquestionが作成されなければanswerに外部キーが導入されることはありません。

そこで今回の状況をみてみるとseed_fuはファイルの順序で上から作成されていきます。

つまりこのままだと先にanswerが作成されてしまうので外部キーにいれるidが存在せずエラーが発生すると言うことです。

ではどうすればいいか。これは添付記事の方法を採用しました。

ファイル名の先頭に数字で順番を明示してあげると言う方法です。

https://i.gyazo.com/133b273efc1ecd548cf49ce7b6abfc33.png

そうすることで順番が正確な位置に入れ替わりました。

 

これで再びrails db:seed_fuを実行するとうまく初期データが入ってくれました。

 

最後に

 

ファイルの順番で作成順が変わると言うことを完全に抜けていました。

思わずコードに目がいってしまいますが今後はこちらも気にしながら開発を進めていこうと思います。