Skip to content
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

Merged
merged 1 commit into from Mar 23, 2022

Conversation

eatplaynap
Copy link
Contributor

@eatplaynap eatplaynap commented Mar 18, 2022

Issue

修正内容

app/models/correct_answer.rbを見ると、correct_answeranswerモデルを単一継承しているため、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テーブルに対してDELETEINSERTDELETEINSERTの順で実行されていることが確認できます。

DELETE FROM "answers";
-- answersテーブル内のレコード削除
INSERT INTO "answers" ("id", "description", "user_id", "question_id", "created_at", "updated_at", "type") VALUES (134407869, 'atom一択です!', 459775584, 302937193, '2022-03-21 10:51:30.189922', '2022-03-21 10:51:30.189922', DEFAULT), (285980417, 'vimしかないでしょう。常識的に考えて。', 609827778, 302937193, '2022-03-21 10:51:30.189922', '2022-03-21 10:51:30.189922', DEFAULT), (638355350, 'injectを使っては?', 459775584, 185017813, '2022-03-21 10:51:30.189922', '2022-03-21 10:51:30.189922', DEFAULT), (946344503, 'テストの回答4です。', 459775584, 1006638408, '2022-03-21 10:51:30.189922', '2022-03-21 10:51:30.189922', DEFAULT), (258941606, 'テストの回答5です。', 459775584, 208331212, '2022-03-21 10:51:30.189922', '2022-03-21 10:51:30.189922', DEFAULT), (375812890, 'Q&Aのコメントです。(ベストアンサーではない)', 679998234, 208331212, '2022-03-21 10:51:30.189922', '2022-03-21 10:51:30.189922', DEFAULT)
-- answers.yml内のレコードがanswersテーブルにINSERTされる
DELETE FROM "answers";
-- さっきINSERTしたanswersテーブル内のレコード削除をしてしまっている!
INSERT INTO "answers" ("id", "description", "user_id", "question_id", "created_at", "updated_at", "type") VALUES (594808440, 'テストの正解回答1です。', 459775584, 1006638408, '2022-03-21 10:51:30.293914', '2022-03-21 10:51:30.293914', 'CorrectAnswer'), (981295044, 'テストの正解回答です。', 421530892, 782854533, '2022-03-21 10:51:30.293914', '2022-03-21 10:51:30.293914', 'CorrectAnswer'), (226127703, 'Q&Aのコメントです。(ベストアンサー)', 679998234, 302937193, '2022-03-21 10:51:30.293914', '2022-03-21 10:51:30.293914', 'CorrectAnswer')
-- correct_answers.yml内のレコードがanswersテーブルにINSERTされる

今回の変更で、create_fixturesを、eachメソッドでymlファイル1つずつについて実行するのではなく、tables配列全体を引数にして実行する形に変更したところ、DELETEINSERTanswersテーブルに対して1度ずつ呼び出され、answers.ymlcorrect_answers.ymlのデータが同時にanswersテーブルに投入されてどちらのデータも残るようになりました。
rails/test_fixtures.rb at dc0f5db3c181e4ee3feafde8b18303faaa78a632 · rails/rails

DELETE FROM "answers";
INSERT INTO "answers" ("id", "description", "user_id", "question_id", "created_at", "updated_at", "type") VALUES (594808440, 'テストの正解回答1です。', 459775584, 1006638408, '2022-03-21 11:29:20.438322', '2022-03-21 11:29:20.438322', 'CorrectAnswer'), (981295044, 'テストの正解回答です。', 421530892, 782854533, '2022-03-21 11:29:20.438322', '2022-03-21 11:29:20.438322', 'CorrectAnswer'), (226127703, 'Q&Aのコメントです。(ベストアンサー)', 679998234, 302937193, '2022-03-21 11:29:20.438322', '2022-03-21 11:29:20.438322', 'CorrectAnswer'), (134407869, 'atom一択です!', 459775584, 302937193, '2022-03-21 11:29:20.423763', '2022-03-21 11:29:20.423763', DEFAULT), (285980417, 'vimしかないでしょう。常識的に考えて。', 609827778, 302937193, '2022-03-21 11:29:20.423763', '2022-03-21 11:29:20.423763', DEFAULT), (638355350, 'injectを使っては?', 459775584, 185017813, '2022-03-21 11:29:20.423763', '2022-03-21 11:29:20.423763', DEFAULT), (946344503, 'テストの回答4です。', 459775584, 1006638408, '2022-03-21 11:29:20.423763', '2022-03-21 11:29:20.423763', DEFAULT), (258941606, 'テストの回答5です。', 459775584, 208331212, '2022-03-21 11:29:20.423763', '2022-03-21 11:29:20.423763', DEFAULT), (375812890, 'Q&Aのコメントです。(ベストアンサーではない)', 679998234, 208331212, '2022-03-21 11:29:20.423763', '2022-03-21 11:29:20.423763', DEFAULT)

確認方法

  1. mainブランチでbin/rails db:seedを実行後、bin/rails cAnswer.countを実行し、correct_answers.yml内に記述された3件の回答データのみが作成されていることを確認する
  2. bug/enable-to-work-db-fixtures-answers-ymlブランチをローカルに取り込みチェックアウトする
  3. bin/rails db:seedを実行後、bin/rails cAnswer.countを実行し、correct_answers.ymlanswers.ymlに記述されたデータがどちらも作成されて9件の回答が作成されていることを確認する

分かりづらい記述になってしまったので、不明点があればご指摘ください!

@eatplaynap eatplaynap requested a review from Paru871 March 21, 2022 11:46
@eatplaynap
Copy link
Contributor Author

@Paru871
お疲れさまです!先日モブプロで一緒に見ていただいたIssueのレビューをお願いいたします:pray:

descriptionの記述内容で不正確・分かりづらいところがあったら遠慮せずにご指摘いただけるとありがたいです!

@eatplaynap eatplaynap marked this pull request as ready for review March 21, 2022 11:48
Copy link
Contributor

@Paru871 Paru871 left a 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テーブルがDELETEINSERTDELETEINSERTの順で実行されていることが確認できます。

rails db:seed実行後のログを見るとanswersテーブルに対してDELETEINSERTDELETEINSERTの順でcreate_fixturesが実行されていることが確認できます。


create_fixturesを、eachメソッドで1つずつ実行するのではなく、テーブルの入った配列を引数にして呼び出す形に変更したところ、DELETEINSERTanswersに対して1度ずつ呼び出されるようになり、先に作成したfixtureデータが削除されないようになりました。

create_fixturesを、eachメソッドでymlファイル1つずつについて実行するのではなく、tables配列全体を引数にして実行する形に変更したところ、DELETEINSERTanswersテーブルに対して1度ずつ呼び出され、answers.ymlcorrect_answers.ymlのデータが同時にanswersテーブルに投入されてどちらのデータも残るようになりました。
rails/test_fixtures.rb at dc0f5db3c181e4ee3feafde8b18303faaa78a632 · rails/rails

@eatplaynap eatplaynap self-assigned this Mar 22, 2022
@eatplaynap eatplaynap requested a review from Paru871 March 22, 2022 04:44
@eatplaynap
Copy link
Contributor Author

@Paru871
ご指摘ありがとうございます〜!ぼんやりしたところが明確になったので大幅に取り入れさせていただきました:sob:
再レビューお願いいたします:pray:

Copy link
Contributor

@Paru871 Paru871 left a 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:

@eatplaynap
Copy link
Contributor Author

@Paru871
レビューありがとうございました〜!

@komagata
チームメンバーのレビューOKいただいたのでお手すきの際にご確認お願いします:pray:

Copy link
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ステージング環境でのデプロイ時に、DBのconstraint(制約)があるためにテーブルを読み込む順番を人間が決めて読み込む必要があってあえてループを使ってたんですが(一気に読み込むとアルファベット順に読み込もうとする)、デプロイ方法を変えたことでもしかしたらいけるようになってるかもなので試しにこのままやってみたいと思います〜

@komagata komagata merged commit 31438ae into main Mar 23, 2022
@komagata komagata deleted the bug/enable-to-work-db-fixtures-answers-yml branch March 23, 2022 00:56
@github-actions github-actions bot mentioned this pull request Mar 23, 2022
17 tasks
@eatplaynap
Copy link
Contributor Author

@komagata
ご確認ありがとうございました!

ステージング環境でのデプロイ時に、DBのconstraint(制約)があるためにテーブルを読み込む順番を人間が決めて読み込む必要があってあえてループを使ってた

なるほどです!それではデプロイが失敗したら、ループの形に戻して、answers.ymlが作れない件はcorrect_answers.yml内のデータをanswers.ymlに集約することで対応しようかと考えています。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants