【Rails】アソシエーション(1:N)
機能が増えるごとに、テーブルも増え、1:Nだけではなく中間テーブルも発生し、頭がごちゃごちゃになってきたので一度簡単に整理したいと思います。
アソシエーションとは
日本語的な意味では「関連付け」、モデル同士の繋がりを指します。
モデルとモデルを関連付けることで、自分のコードの共通操作がシンプルになって扱いやすくなります。
アソシエーションの種類
たとえば、あるモデルが他のモデルに従属している(belongs_to)と宣言すると、2つのモデルのそれぞれのインスタンス間で「主キー - 外部キー」情報を保持しておくようにRailsに指示が伝わります。Railsのアソシエーションには下記の6種類があります。
- belongs_to
- has_many
- has_one
- has_many :through
- has_one :through
- has_and_belongs_to_many
1対Nの関係
1対Nの関係とは、「1対多数」のことです。データベース上のテーブルで1つのレコードに対し複数のレコードが関連付けられていることをいいます。
例として1をuser
、Nをbook
とした際に、1人のuserに対して投稿されるbookの数は複数あることから「1対N」となります。
1対Nの関係性をモデルに実装
has_manyを使用
上記のuser
とbook
を例として、実装をしていきます。
まずはuserモデルに対して、bookモデルが 1:N になるよう関連付けます。
ここでは、先ほどの6種類にあったhas_many
が使用されます。
class User < ApplicationRecord
・
・
has_many :books, dependent: :destroy
end
has_many
とは、直訳すると「たくさん持っている」という意味になります。
1:N の関係とは「1人のユーザーが、N冊投稿することができる」という状況を示していました。
言い換えると「1人のユーザーが、たくさん投稿することができる」ということになります。
つまり、1人のユーザーが何をたくさん持っているか?というのを定義するのが、この場合のhas_many
なのです。
ちなみにdependent: :destroy
の意味は、「1:Nの1側が削除されたとき、N側を全て削除する」という機能になります。この記述がないと「Userが削除されたときに、誰が投稿したか分からないBookが残る」という状態になってしまい、エラーになります。
belongs_toを使用
次に、bookモデルに対して、userモデルとの関係性を追加していきます。
class Book < ApplicationRecord
has_one_attached :book
belongs_to :user
end
belongs to〜
とは、直訳すると「〜に属する」という意味です。
belongs_to
は、bookモデルから user_id に関連付けられていて、userモデルを参照することができます。
bookモデルに関連付けられるのは、1つのuserモデルです。
以上が1対Nをメインとしたアソシエーションになります。
テーブルが増えるごとにどれがどれかゴチャゴチャになる時があるので原点回帰として書かせてもらいました。多対多や中間テーブルに関してはまた別で復習できればと思います。
参考
Discussion