1
1

More than 1 year has passed since last update.

Railsにおけるアソシエーションについて整理する

Last updated at Posted at 2022-12-15

アソシエーションとは、モデルを利用したテーブル同士の関連付けのことである。

アソシエーションをモデルに定義することで、そのモデルに紐づく別のモデルの情報へアクセスできるようになる。

1:1または1:多の関係

例としてTwitterのようなアプリを作成することを仮定してテーブル同士についての関係性を書いてみる。

has oneの関係

例1
スクリーンショット 2022-12-15 10.42.12.png
上記の状態のときusersテーブルAさんはtweetsテーブルに対して一度しかツイートを投稿できないとする。
つまり、usersテーブルからみて、tweetsテーブルは 「1:1」 の関係になり、このことを、has oneの関係といい、「User has one Tweet」の状態であると言える。
これは1:1の関係を表している。

belongs toの関係

例2
スクリーンショット 2022-12-15 10.43.14.png
例1と反対の矢印を考えてみる。
この場合、大切なのは従属関係である。
tweetsテーブルからみてusersテーブルは確かに1:1の関係にあるが、「投稿する人」(ユーザー)がいるから投稿内容ができあがるのである。
つまり、従属関係の視点からみると、tweetsテーブルはusersテーブルに「1:1」の関係であるものの、usersテーブルに従う形になっているので、これをbelongs toの関係といい、今回の場合は、「Tweet belongs to User」の状態であると言える。

has manyの関係

例3
スクリーンショット 2022-12-15 10.47.22.png
先ほどまでの例と違って、今度は一人が複数投稿できるものとする。
usersテーブルの視点で考えると、あるユーザーの作成した投稿は複数個ある状態である。
つまり、1人のユーザーは複数の投稿を所有している。
この状態のことをhas manyの関係といい、今回の場合は「User has many Tweets」の状態であると言える。
これは「1:多」の関係を表している。

belongs toの関係

例4
スクリーンショット 2022-12-15 10.48.36.png
例2でもbelongs toの関係が出てきたが、 tweetsテーブルからみて、usersテーブルは「1:1」の関係であり、従属関係はusersが主になっている。 したがってこの関係もbelongs toとなり、」「Tweet belongs to User」の状態であると言える。

多対多の関係

次は、例としてチャットアプリを作成することを仮定してモデルについての関係性を書いてみる。
チャットアプリにはチャットルームがあり、チャットルームでは個人同士が自由にコメントできるとする。

usersテーブルとmessagesテーブル

どのユーザーが投稿したかを管理する必要があるため
スクリーンショット 2022-12-15 11.02.31.png

roomsテーブルとmessagesテーブル

どのチャットルームで投稿されたメッセージなのかを管理するため
スクリーンショット 2022-12-15 11.04.19.png

以上までが、これまでやってきた「1:多」の関係である。
では、これはどうだろうか。

usersテーブルとroomsテーブル

ユーザーがどのチャットルームに属しているかを管理するため
チャットルームにどのユーザーが存在するかを管理するため
スクリーンショット 2022-12-15 11.13.45.png
ここで注目すべきポイントは、usersテーブルとroomsテーブルの関係性が、これまでのような「1対多」ではないことである。
「多対多」は、関連するテーブルのidをお互いが複数持っている関係性のことである。たとえば今回のような、「ユーザーは複数のチャットルームに所属する」「チャットルームには複数ユーザーが所属する」という場合の関係性のことである。

これでは複雑になってしまうので、考え出されたのが 「中間テーブル」 である。
中間テーブルとは、その名の通り2つのテーブルの中間にあるテーブルのことである。
中間テーブルは、多対多の関係にある2つのテーブルの間に挟まって、2つの組み合わせパターンだけをレコードとして保存する。
スクリーンショット 2022-12-15 11.32.32.png
2つのモデルのみでは多対多のアソシエーションを組むことができないため、 中間テーブルを利用して多対多の関係を定義する。

なお、中間テーブルを介してhas manyの関係を築くためには、 throughをつける必要があるので留意する。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1