-
Notifications
You must be signed in to change notification settings - Fork 71
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
db/fixtures/answers.yml内のデータを作成できるようにした #4447
Conversation
@Paru871 descriptionの記述内容で不正確・分かりづらいところがあったら遠慮せずにご指摘いただけるとありがたいです! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@eatplaynap
お疲れさまです。この度はレビューのご依頼をいただきありがとうございます!
先日のモブプロで問題点を共有させていただいてポイントが理解できていましたので、私なりの理解も加えてdescription内の文章を提案させていただきます。
修正前と修正後のログデータを載せるのはとても有効でわかりやすいと思います!
db/seeds.rb
内で書かれているtables
という配列について、配列の中身はテーブル名ではなくymlファイル名ですので、ここが混乱の元かなと思いました。
ymlのデータとデータ投入先のDBテーブルを明確に書き分けると何が問題だったのかがわかりやすいと考えましたので、提案させていただきます。かなり長くて回りくどくなったので、この通りでなくても全く構いません!参考にしていただけたらと思います。
(データ→レコードに変えるのもよいと思います。)
修正前の
db/seeds.rb
では、配列に入ったテーブルひとつずつに対しeachメソッドでActiveRecord::FixtureSet.create_fixtures
を実行していたため、同名のテーブルが複数ある場合、先にcreate_fixtures
を実行したテーブルを上書きする形で新しいテーブルに対してcreate_fixtures
が実行されていました。そのため、先に実行されたanswers
テーブルのfixtureは1度作成されたあと、correct_answers
(つまりanswers
)テーブルのfixtureを作る前に削除されてしまい、後から実行されたcorrect_answers
のfixtureデータのみが残る形になっていました。
修正前のdb/seeds.rb
では、tables
という配列に入ったymlファイルひとつずつについてeachメソッドでActiveRecord::FixtureSet.create_fixtures
を実行していました。
create_fixtures
は実行時に毎回、ymlデータ投入先のテーブルに存在しているデータを削除した後にymlデータの流し込みを行っています。
つまり、ymlデータ投入先のテーブルに重複がある場合は、先にcreate_fixtures
を実行したデータを上書きする形で新しいymlデータについてcreate_fixtures
が実行されることになります。
そのため、先に実行されたanswers.yml
のfixtureは1度answersテーブル
に作成されたあと、correct_answers.yml
のfixtureを作る前に削除されてしまい、後から実行されたcorrect_answers.yml
のfixtureデータのみがanswersテーブル
に残る形になっていました。
rails db:seed
実行後のログを見るとanswers
テーブルがDELETE
→INSERT
→DELETE
→INSERT
の順で実行されていることが確認できます。
rails db:seed
実行後のログを見るとanswersテーブル
に対してDELETE
→INSERT
→DELETE
→INSERT
の順でcreate_fixtures
が実行されていることが確認できます。
create_fixtures
を、eachメソッドで1つずつ実行するのではなく、テーブルの入った配列を引数にして呼び出す形に変更したところ、DELETE
とINSERT
がanswers
に対して1度ずつ呼び出されるようになり、先に作成したfixtureデータが削除されないようになりました。
create_fixtures
を、eachメソッドでymlファイル1つずつについて実行するのではなく、tables配列
全体を引数にして実行する形に変更したところ、DELETE
とINSERT
がanswersテーブル
に対して1度ずつ呼び出され、answers.yml
とcorrect_answers.yml
のデータが同時にanswersテーブル
に投入されてどちらのデータも残るようになりました。
rails/test_fixtures.rb at dc0f5db3c181e4ee3feafde8b18303faaa78a632 · rails/rails
@Paru871 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@eatplaynap
お疲れさまです。descriptionの修正をしていただいて、何が問題だったのか、何を修正したのかがよく理解できるようになったと思います。修正ありがとうございました!
LGTMです〜:tada:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ステージング環境でのデプロイ時に、DBのconstraint(制約)があるためにテーブルを読み込む順番を人間が決めて読み込む必要があってあえてループを使ってたんですが(一気に読み込むとアルファベット順に読み込もうとする)、デプロイ方法を変えたことでもしかしたらいけるようになってるかもなので試しにこのままやってみたいと思います〜
@komagata
なるほどです!それではデプロイが失敗したら、ループの形に戻して、 |
Issue
correct_answers.yml
内の回答データは作成できるが、answers.yml
内の回答データが作成できなかった修正内容
app/models/correct_answer.rb
を見ると、correct_answer
はanswer
モデルを単一継承しているため、DB上のテーブルはcorrect_answers
ではなくanswers
テーブルであることが確認できます。修正前の
db/seeds.rb
では、tables
という配列に入ったymlファイルひとつずつについてeachメソッドでActiveRecord::FixtureSet.create_fixtures
を実行していました。create_fixtures
は実行時に毎回、ymlデータ投入先のテーブルに存在しているレコードを削除した後にymlデータの流し込みを行っています。つまり、ひとつのテーブルに対し複数のymlデータを投入する場合は、先に
create_fixtures
を実行したレコードを上書きする形で新しいymlデータに対してcreate_fixtures
が実行されることになります。そのため、先に実行された
answers.yml
のfixtureは1度answers
テーブルに作成されたあと、correct_answers.yml
のfixtureを作る前に削除されてしまい、後から実行されたcorrect_answers.yml
のfixtureデータのみがanswers
テーブルに残る形になっていました。rails db:seed
実行後のログを見ると、create_fixtures
によって、answers
テーブルに対してDELETE
→INSERT
→DELETE
→INSERT
の順で実行されていることが確認できます。今回の変更で、
create_fixtures
を、eachメソッドでymlファイル1つずつについて実行するのではなく、tables配列
全体を引数にして実行する形に変更したところ、DELETE
とINSERT
がanswers
テーブルに対して1度ずつ呼び出され、answers.yml
とcorrect_answers.yml
のデータが同時にanswers
テーブルに投入されてどちらのデータも残るようになりました。rails/test_fixtures.rb at dc0f5db3c181e4ee3feafde8b18303faaa78a632 · rails/rails
確認方法
main
ブランチでbin/rails db:seed
を実行後、bin/rails c
でAnswer.count
を実行し、correct_answers.yml
内に記述された3件の回答データのみが作成されていることを確認するbug/enable-to-work-db-fixtures-answers-yml
ブランチをローカルに取り込みチェックアウトするbin/rails db:seed
を実行後、bin/rails c
でAnswer.count
を実行し、correct_answers.yml
とanswers.yml
に記述されたデータがどちらも作成されて9件の回答が作成されていることを確認する分かりづらい記述になってしまったので、不明点があればご指摘ください!