アソシエーションを組む時に使う、belongs_to/has_one/has_manyの違いについて。
railsにおいて、アソシエーションを組んでテーブル同士を結びつける時に使うbelongs_to/has_one/has_manyのそれぞれの使い分けについてまとめます。
アプリの概要
メルカリのようなフリマアプリで考えていきます。
まず、userテーブル、itemテーブル、purchaseテーブルの3つのテーブルを設計したとします。
userテーブルでuserの情報を管理します。itemテーブルでは商品の情報を管理します。purchaseテーブルには購入履歴を管理します。以下イメージです。
アソシエションについて
belongs_toメソッド
商品1つに対して、出品者は1人になるためです。
1つの商品に複数人が出品できないため、商品は必ず1人に所属します。
この状態をbelongs_toの関係といいます。
has_oneメソッド
has_oneメソッドは1対1の関係を結ぶメソッドです。
上の図ではitemとpurchaseがそれにあたります。
商品1つに対して、購入履歴は1つになるためです。
親のモデル(今回は商品がなければ、購入履歴がありえないため、itemが親になります。)にhas_oneの記述をします。
子のモデルにbelongs_to(今回はpurchaseが子になります。)の記述を行います。
has_manyメソッド
user側からすると出品する商品(item)は複数あります。
つまり1人のuserは複数のitemを持ちます。
この関係をhas_manyの関係といいます。
このuser1人に対して複数商品がある状態を1対多(has_many)の関係にあるといいます。
まとめ
belongs_toは1対1の関係で子側(後から作られるもの)のモデルに書く。
has_oneは1対1の関係で親側(先に作られるもの)のモデルに書く。
has_many1対多の関係で複数持つ側のモデルに書く。