【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の例だと、多対多の関係の間に中間テーブルが割入ってくれるのはイメージしやすい。これ以外に、コメントやタグ付け、お気に入り登録などいろんな機能実装にチャレンジしていく中で、アソシエーションの紐付けがたくさん出てきて、こう振り返ってみるとシンプルだけど重要性をかなり感じた。