#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というカラムが存在する(外部キー)。外部キーのテーブル名は単数形。