** 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を書くわけですね。

** 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(志田)


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

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