** joinsオプション [#a080867d]
 関連名による INNER JOIN が欲しい
 http://wota.jp/ac/?date=20060514
  Member.find(:all, 
              :joins=>"INNER JOIN groups ON groups.id = members.group_id 
                       INNER JOIN favorites ...")
 なるほど、普通のJOIN(等価結合)をやりたい場合は、joinsに、INNER JOINを書けばよいのか。
 なるほど、普通のJOIN(等価結合)をやりたい場合は、joinsに、INNER JOINを書くわけですね。
 
 ** includeオプション [#qfd8d25d]
 includeオプションによる実行
 http://wota.jp/ac/?date=20060120
 
  普通に Member.find(:all) で取得して個別に member.favorite するのと一見
  同じに見えますが、通常の関連への参照(member.favorite)はその都度取得クエリを
  実行しますので、100エントリあった場合は最初のfind(:all)も含めると101回のクエリ
  が発行されてしまいます。
  それに対して、:include オプションを利用すると最初の find(:all) の時点で関連
  するデータまで先に取得(Eager loading)してくれますので1回のクエリで済んで
  しまうのです!
   * カラム名の衝突を回避
   * Eager loading によるクエリ発行回数の最適化
   * 関連参照オブジェクトへの自動格納
  という3つのメリットを併せ持つこの:include機能を使わないと、ActiveRecordの
  恩恵を半分程度しか受けてないことになるでしょう。
  (そう、全部 find_by_sql でゴリゴリやってた昨日までの私です)。
 なるほど。
 
 - includeはOUTER JOINだから、関連があれば、オブジェクトもあらかじめつけとくよ、ってことになりますね。
 - なんだかOUTER JOINはあまり使ってこなかったので不安ですが、関連をNULL不可にしとおけば、常にincludeオプションを使うってことでもよいのか...?
 - でも、手元のrails本249ページによれば、includeはメモリを大きく食うからケースバイケースだ、とのことですね。なるほど、関連オブジェクトを使わないケースでは、includeは使わない方がよさそう。
 
 #blikifooter(志田)
 
 tag: [[Ruby on Rails>tag/Ruby on Rails]]
 

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

アークウェブのサービスやソリューションはこちら