前提
- 問題の作成、回答ができる
- 回答の選択肢を増やせる
上記のようなアプリを作りたい方は、ぜひ参考にしてみてください。
完成系
 
テーブルの役割
quizzesテーブル
作成者の情報と問題の大枠を管理する。
questionsテーブル
問題の内容を格納する。
choicesテーブル
選択肢の情報を格納する。
また、correct_answerをbooleanで設定し、回答正誤を判定する。
challengersテーブル
回答者の情報を管理しています。
また、ランキング機能を作るためにscoreカラムを追加。
解説
NGパターン
クイズアプリのテーブル設計をする際パッと思いつくのは、こんな感じではないでしょうか?
| question | choice_1 | choice_2 | correct_answer | 
|---|---|---|---|
| 休みの日は何して過ごす? | 家でゴロゴロ | 外へおでかけ | 1 | 
| どっが好き? | レストラン | 大衆居酒屋 | 2 | 
しかしこれだと、選択肢を追加したいときにはカラムを増やすしかなくなってしまいます。
OKパターン
それぞれにテーブルを設け、questions < choices の関係でアソシエーションを組む。
| id | question | 
|---|---|
| 1 | 休みの日は何して過ごす? | 
| 2 | どっが好き? | 
| id | choice | correct_answer | question_id | 
|---|---|---|---|
| 1 | お家でゴロゴロ | true | 1 | 
| 2 | 外へおでかけ | false | 1 | 
| 3 | レストラン | false | 2 | 
| 4 | 大衆居酒屋 | true | 2 | 
