【Rails】多対多のAssociation
タグ付け機能とかお気に入り機能を実装していく過程で、中間テーブルを用意して多対多の関係を関連付けることが重要だったため、復習のために基礎をおさらいしていく。
アソシエーションとは
モデル同士の関連付けをすること。
例えば、Twitterを例にして、ユーザー・ツイート・コメントの3つのモデルがあるとする。ユーザーはたくさんのツイートやコメントを持っているが、ツイートは必ず唯一のユーザーに紐付いているし、コメントは必ずいずれかのツイートに紐付いていて、唯一のユーザーによって投稿されている。「誰が」「どのツイートに」対してコメントしたのかという、モデル同士の関連付けによって、あるユーザーのツイートを全て取得することや、あるツイートに対するコメントのユーザーを取得するといったことができるようになる。
多対多のアソシエーション
例えば、LINEを例にすると、グループトークルーム1にはユーザーがたくさん入っていて、ユーザーは他のグループトークルーム2にも属している。この場合、ユーザーは多くのトークルームを持っているかつ、トークルームは多くのユーザーを持っている。このような関係性を多対多の関係という。
この関係性を示すために、中間テーブルが使われる。
中間テーブル
多対多の関係において、2つのモデルだけではアソシエーションは組めないため、中間テーブルが2つのテーブルの間に入って、組み合わせのパターンだけをレコードとして保存する。
中間テーブルは「どのユーザーとどのトークルームが紐付いているか」という情報を保存している。
throughオプション
中間テーブルを経由してアソシエーションを組むときは、throughオプションを使う。
class User < ApplicationRecord has_many :room_users has_many :rooms, through: :room_users end
class Room < ApplicationRecord has_many :room_users has_many :users, through: :room_users end
class RoomUser < ApplicationRecord belongs_to :user belongs_to :room end
アソシエーションを組む前はER図を書いてから、記述をしたほうが設計もスムーズに行うことができる。必ずER図を書きながらアソシエーションを考える過程を経てから、コードを記述するようにする。
終わりに
今回のLINEの例だと、多対多の関係の間に中間テーブルが割入ってくれるのはイメージしやすい。これ以外に、コメントやタグ付け、お気に入り登録などいろんな機能実装にチャレンジしていく中で、アソシエーションの紐付けがたくさん出てきて、こう振り返ってみるとシンプルだけど重要性をかなり感じた。