Ruby on Rails/ActiveRecordのfind http://www.ark-web.jp/sandbox/wiki/385.html

[edit]

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

[edit]

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 でゴリゴリやってた昨日までの私です)。

なるほど。

投稿者志田 | パーマリンク

| append.gif

tag: Ruby on Rails


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-05-08 (火) 19:40:45 (4518d)

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