中間テーブルとは
二つのアソシエーションしたいテーブル同士が「多対多」の関係のときに、テーブルの間を受け持つ、便利なやつ。
具体例
LINEを思い浮かべると、一人のユーザーはいくつものグループに所属している。また、一つのグループには、何人ものユーザーが招待されている。このとき、ユーザーとグループは「多対多」の関係と言える。
問題点
「多対多」のテーブルをそのままアソシエーションすることが困難である。
解決策
先の例で言えば、ユーザーとグループの間に組み合わせを記録するテーブルをかませる。それが、中間テーブル。ユーザーとグループの組み合わせを記録するというのがポイントで、カラムにはユーザーidとグループidが必要となる。
記述
アソシエーションをするため、「has_manyメソッド」「belongs_toメソッド」を使う。
そのモデル(テーブル)ファイルの目線になって、繋がりを持ちたいモデル(テーブル)にはが複数か単数か考える。
ex) user(モデル) has_many groups
ここは、もはや英語の話。
group.rb
has_many :user_groups
has_many :users, through: :user_groups
user.rb
has_many :user_groups
has_many :groups, through: :user_groups
user_group.rb
belongs_to :user
belongs_to :group
注意
直接的に繋がっていないモデルには、「throughオプション」を使う。
ポイント
- 中間テーブルは必ず「belongs_toメソッド」で、後に続くモデル名は単数形。
- アソシエーションしたいテーブル同士は間接的に多対多の関係になる。
- 中間テーブルではないテーブルは必ず「has_manyメソッド」で、後に続くモデル名は複数形。
- 「throughオプション」を使って、経由しているモデル名を複数形で記述。
最後に
人生で初めてQiitaに投稿します。自分のアウトプットを目的としていますが、お気づきの点があれば、ご指摘ください。