📚

【Rails】アソシエーション(1:N)

2023/10/06に公開

機能が増えるごとに、テーブルも増え、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を使用

上記のuserbookを例として、実装をしていきます。
まずはuserモデルに対して、bookモデルが 1:N になるよう関連付けます。
ここでは、先ほどの6種類にあったhas_manyが使用されます。

app/models/user.rb
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モデルとの関係性を追加していきます。

app/models/book.rb
class Book < ApplicationRecord
  has_one_attached :book  
  belongs_to :user
end

belongs to〜とは、直訳すると「〜に属する」という意味です。

belongs_toは、bookモデルから user_id に関連付けられていて、userモデルを参照することができます。
bookモデルに関連付けられるのは、1つのuserモデルです。

以上が1対Nをメインとしたアソシエーションになります。
テーブルが増えるごとにどれがどれかゴチャゴチャになる時があるので原点回帰として書かせてもらいました。多対多や中間テーブルに関してはまた別で復習できればと思います。

参考

http://railman.net/railsguides/4.2/association_basics.html
https://zenn.dev/goldsaya/articles/7f64ecf7b5275e

Discussion