アソシエーションとは、モデルを利用したテーブル同士の関連付けのことである。
アソシエーションをモデルに定義することで、そのモデルに紐づく別のモデルの情報へアクセスできるようになる。
1:1または1:多の関係
例としてTwitterのようなアプリを作成することを仮定してテーブル同士についての関係性を書いてみる。
has oneの関係
例1
上記の状態のときusersテーブルAさんはtweetsテーブルに対して一度しかツイートを投稿できないとする。
つまり、usersテーブルからみて、tweetsテーブルは 「1:1」 の関係になり、このことを、has oneの関係といい、「User has one Tweet」の状態であると言える。
これは1:1の関係を表している。
belongs toの関係
例2
例1と反対の矢印を考えてみる。
この場合、大切なのは従属関係である。
tweetsテーブルからみてusersテーブルは確かに1:1の関係にあるが、「投稿する人」(ユーザー)がいるから投稿内容ができあがるのである。
つまり、従属関係の視点からみると、tweetsテーブルはusersテーブルに「1:1」の関係であるものの、usersテーブルに従う形になっているので、これをbelongs toの関係といい、今回の場合は、「Tweet belongs to User」の状態であると言える。
has manyの関係
例3
先ほどまでの例と違って、今度は一人が複数投稿できるものとする。
usersテーブルの視点で考えると、あるユーザーの作成した投稿は複数個ある状態である。
つまり、1人のユーザーは複数の投稿を所有している。
この状態のことをhas manyの関係といい、今回の場合は「User has many Tweets」の状態であると言える。
これは「1:多」の関係を表している。
belongs toの関係
例4
例2でもbelongs toの関係が出てきたが、 tweetsテーブルからみて、usersテーブルは「1:1」の関係であり、従属関係はusersが主になっている。 したがってこの関係もbelongs toとなり、」「Tweet belongs to User」の状態であると言える。
多対多の関係
次は、例としてチャットアプリを作成することを仮定してモデルについての関係性を書いてみる。
チャットアプリにはチャットルームがあり、チャットルームでは個人同士が自由にコメントできるとする。
usersテーブルとmessagesテーブル
roomsテーブルとmessagesテーブル
どのチャットルームで投稿されたメッセージなのかを管理するため
以上までが、これまでやってきた「1:多」の関係である。
では、これはどうだろうか。
usersテーブルとroomsテーブル
ユーザーがどのチャットルームに属しているかを管理するため
チャットルームにどのユーザーが存在するかを管理するため
ここで注目すべきポイントは、usersテーブルとroomsテーブルの関係性が、これまでのような「1対多」ではないことである。
「多対多」は、関連するテーブルのidをお互いが複数持っている関係性のことである。たとえば今回のような、「ユーザーは複数のチャットルームに所属する」「チャットルームには複数ユーザーが所属する」という場合の関係性のことである。
これでは複雑になってしまうので、考え出されたのが 「中間テーブル」 である。
中間テーブルとは、その名の通り2つのテーブルの中間にあるテーブルのことである。
中間テーブルは、多対多の関係にある2つのテーブルの間に挟まって、2つの組み合わせパターンだけをレコードとして保存する。
2つのモデルのみでは多対多のアソシエーションを組むことができないため、 中間テーブルを利用して多対多の関係を定義する。
なお、中間テーブルを介してhas manyの関係を築くためには、 throughをつける必要があるので留意する。