- バックアップ一覧
- ソース を表示
- Ruby on Rails/ActiveRecordのfind は削除されています。
- 1 (2007-04-29 (日) 23:16:30)
- 2 (2007-04-29 (日) 23:19:10)
- 3 (2007-05-07 (月) 17:35:03)
joinsオプション †
関連名による 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オプション †
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は使わない方がよさそう。