アソシエーションを組む時に使う、belongs_to/has_one/has_manyの違いについて。

railsにおいて、アソシエーションを組んでテーブル同士を結びつける時に使うbelongs_to/has_one/has_manyのそれぞれの使い分けについてまとめます。

 

アプリの概要

メルカリのようなフリマアプリで考えていきます。

まず、userテーブル、itemテーブル、purchaseテーブルの3つのテーブルを設計したとします。

userテーブルでuserの情報を管理します。itemテーブルでは商品の情報を管理します。purchaseテーブルには購入履歴を管理します。以下イメージです。

 

gyazo.com

 

アソシエションについて

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対多の関係で複数持つ側のモデルに書く。