RailsのActiverecordの1対1の関連について
has_one か belongs_to どっちを使ったらいいの??
Ruby on RailsのActiverecordで1対1の関連のテーブルに簡単にアクセスするためには、 以下のいずれかを使うことになります。
- has_one
- belongs_to
よくどっちをつかったらいいんだっけ?という気分になるんですが、
どちらかを使うかの違いは、従属関係によって変わってきます。
従属関係を考えるときに、
主キー(PRIMARY KEY)と外部キー(FOREIGN KEY)をどちらが持っているかに注目するとわかりやすいです。
今回の説明では、主キーを持っている方が親、その主キーを外部キーに持っている方を子供として考えます。
そして、has_oneを使うかbelongs_toを使うかは、親から子供を参照するか、子供から親を参照するかの違いになり
has_one :[子供のモデル] => 親から子供 belongs_to :[親のモデル] => 子供から親
という形になります。
サンプルコード
仮に、以下のようなOrderテーブルとItemテーブルがあったばあい
親:Orderテーブル id order_at total_price
子供 : Paymentテーブル id order_id payment_type card_no
モデルの設定は以下のようになります。
class Order < ActiveRecord::Base has_one :payment end class Payment < ActiveRecord::Base belongs_to :order end
上記のような設定を行ったうえで
Order.find(1).payment
とすると、以下のようなURLが発行されます。
SELECT `payment`.* FROM `payment` WHERE `payment`.`order_id` = 1