Tag: Rails/モデル

目次

関連ページ

参考情報

リレーション

参考情報

has_one

  • 注文に対し、注文明細が1:1で存在するような場合に使用する。
  • 例えばOrder, OrderDetail(order_id)の場合に、
    class Order
      has_one :order_dtail
    end
    
  • とすると、order.order_detailで自動的に読み込んでくれる(idで検索する)。
  • 条件を指定することもできる
    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

  • OrderDetailから、Orderを参照したいときに使う(単数で指定)。
    class OrderDetail
      belongs_to :order
    end
    
  • order_detailsにはorder_idが存在すること。

foreign_key、primary_keyの指定

  • 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で条件指定

  • Rails 4ではconditionではなくて、lambdaを使う。
  • ただしconditionsだけではだめで、foreign_key、primary_keyの指定が必須?
  • 例えば自テーブルのurlとng_itemのvalueを一致させて、さらにng_itemのkindがKIND__URLのときだけ取得したい場合。
      belongs_to :ng_item,
                 -> {where(kind: NgItem::KIND__URL)},
                 :foreign_key => 'url', :primary_key => 'value'
    

has_one / belongs_toの考え方

  • メイン側モデルはhas_one。
  • 従属側モデルはbelongs_to。従属側モデルはxxx_idでメイン側モデルを参照している。
  • 従属モデルに外部キーが存在する。
  • メイン側は、従属側の外部キーなど我関せずであると考えればわかりやすい?
  • トランザクションテーブルからマスターテーブルを参照する場合、has_oneではなくてbelongs_toで参照することになる。この場合もマスターテーブルに外部キーを入れるわけにはいかないと考えると分かりやすい?(変更不可の大元情報だし)。

has_many

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

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-06-01 (木) 13:54:01