# メンターさんとペアプロ 9/13(火) ## 参考 - [各レコードがcreate,update,deleteするタイミングを考える](https://www.notion.so/create-update-delete-0782ffd77b814cc3ab57177d99231445#a83992ef7f3247a9a23e529f83ba9a6e) - 前回:[8/11\(水\) メンターさんペアプロ メモ \- HackMD](https://hackmd.io/Y62a5EWQTUeDulfvk2IuNA?view) ## 実現したいk遠 中間テーブルのレコードのcreate/destroyを、以下のタイミングでできるようにしたい。 - issue/PR のレコードをcreate/updateした時 - 1. 登録済みuser がassign / request review されているものがあれば、中間テーブルのレコードをcreateして紐づける - 2. assignees / reviewers カラムに登録済みuserの値が無くなっていたら、中間テーブルのレコードをdestroyする - user が自作アプリに登録/退会した時 - 3. 登録時、既にDBに保存されている issue/PR を見に行き、登録したuserが assign / request review されているものがあれば、中間テーブルのレコードをcreateして紐づける - 4. 退会時、そのuserと紐づいているissue/PRの中間テーブルのレコードをdestroy . ## 結論:中間テーブルは必要ない - 既に持っているデータで、欲しいデータを取得することが可能であれば、中間テーブルの作成は必要ない - 「欲しいデータを取得できるけど、発行するSQL文のパフォーマンスが悪い」場合は、関連づけも検討する必要がある →🤔 今回は、`where`メソッドを使って検索した結果を表示している。 `AssignedIssue.where("#{user.uid} = ANY(assignees)").sum(:point)`や`ReviewRequestedPullRequest.where("#{user.uid} = ANY(reviewers)")`など。 whereメソッドを使ってデータを取得するのは、bootcampアプリでもモデルにメソッドを作成したりとよくやっていたので、パフォーマンスが低いということは無いと思われる。 - 今回、assigneesとreviewersカラムは、`[ユーザー1のuid,ユーザー2のuid]`というように、配列で入るようになっている。もし、正規化して別テーブルに切り出した場合は、中間テーブルが必要になる。