#author("2016-10-03T20:26:40+09:00","default:wikiwriter","wikiwriter")
#author("2017-06-01T13:54:00+09:00","default:wikiwriter","wikiwriter")
&tag(Rails/モデル);
*目次 [#m834da88]
#contents
*関連ページ [#s6c9d29c]
-[[../マイグレーション]]

*参考情報 [#y691e92b]


*リレーション [#ocd095b5]

**参考情報 [#t2ea06fb]
-[[belongs_toとhas_one の違い|WEBデザイン Tips:http://blog.digital-squad.net/article/278843296.html]]
-[[Active Record の関連付け (アソシエーション) | Rails ガイド:http://railsguides.jp/association_basics.html]]…結局ここが一番分かりやすい。

**has_one [#m19450bf]
-注文に対し、注文明細が1:1で存在するような場合に使用する。
-例えばOrder, OrderDetail(order_id)の場合に、
#pre{{
class Order
  has_one :order_dtail
end
}}
-とすると、order.order_detailで自動的に読み込んでくれる(idで検索する)。
-条件を指定することもできる
#pre{{
class Order
  has_one :order_dtail, :through => :order_dtail, :conditions => ['order.active = ?', true]

end
}}
-order.order_detail = new_order_detailするとセットした瞬間にnew_order_detailがsaveされる。これはautosave無関係。
-これを避けるためには、new_order_detail = order.build_order_detail しなければならない(この場合、new_order_detail.order_id は自動でセットされる。保存されてない状態)。
**belongs_to [#ab4dfaa8]
-OrderDetailから、Orderを参照したいときに使う(単数で指定)。
#pre{{
class OrderDetail
  belongs_to :order
end
}}
-order_detailsにはorder_idが存在すること。

***foreign_key、primary_keyの指定 [#nb44d14e]
-foreign_keyは自分のテーブルの外部キー、primary_keyはよそのテーブルの任意のキー。
-例えばsoftware_infoと関連を持ち、自テーブルのurl、software_infoのweb_site_urlと関連させたい場合。
 belongs_to :software_info, :foreign_key => 'url', :primary_key => 'web_site_url'


***belongs_toで条件指定 [#x6dfcf88]
-Rails 4ではconditionではなくて、lambdaを使う。
-ただしconditionsだけではだめで、foreign_key、primary_keyの指定が必須?
-例えば自テーブルのurlとng_itemのvalueを一致させて、さらにng_itemのkindがKIND__URLのときだけ取得したい場合。
#pre{{
  belongs_to :ng_item,
             -> {where(kind: NgItem::KIND__URL)},
             :foreign_key => 'url', :primary_key => 'value'
}}
**has_one / belongs_toの考え方 [#sca68442]
-メイン側モデルはhas_one。
-従属側モデルはbelongs_to。従属側モデルはxxx_idでメイン側モデルを参照している。
-従属モデルに外部キーが存在する。
-メイン側は、従属側の外部キーなど我関せずであると考えればわかりやすい?
-トランザクションテーブルからマスターテーブルを参照する場合、has_oneではなくてbelongs_toで参照することになる。この場合もマスターテーブルに外部キーを入れるわけにはいかないと考えると分かりやすい?(変更不可の大元情報だし)。


**has_many [#w3aa5f7e]

-メイン側にhas_manyを追加。従属側はbelongs_to(なくてもよい)。
-[[Active Record の関連付け (アソシエーション) | Rails ガイド:https://railsguides.jp/association_basics.html]]の場合、Customerがメイン。Orderが従属。
#pre{{
class Customer < ActiveRecord::Base
  has_many :orders, dependent: :destroy
end
 
class Order < ActiveRecord::Base
  belongs_to :customer
end
}}
-Orderにはcustomer_idというカラムが存在する(外部キー)。外部キーのテーブル名は単数形。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS