ECのウェブ担当者のメモ

ECサイトを運営管理している、WEB担当プログラマのメモ

スポンサーリンク

RailsのActiverecordの1対1の関連について

f:id:jun9632:20160205120604p:plain

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

過去の関連記事

marketing-web.hatenablog.com

marketing-web.hatenablog.com