このところ、named_scope関係のバグの原因と対処法を調べるために ActiveRecordのEager Loadingの実装を調べていました。 ActiveRecordのEager Loadingは、 Rails2.1から、若干生成するSQLが変化しています。

Rails 2.1 Eager Loading

上記サイトでも紹介されているように、 今まではLEFT OUTER JOINを使って、 一回のクエリで全て読み込むようなSQLを生成していたのですが、 Rails2.1からは、複数回のクエリに分割するようになりました。

ということで、Eager Loadingを実際にやっているコードを調べてみたのですが、自分で好きなタイミングでEager Loadingを行う方法を見つけたので紹介します。

ActiveRecord::BaseクラスのprotectedメソッドActiveRecord.preload_associationsを利用します。

   1  articles = Article.all(:limit => 5)
   2  Article.send :preload_associations, articles, [:user => :face]

1行目は普通にEager LoadingせずにArticleリストを取得していますが、 二行目を実行することで、各ArticleのアソシエイションがEager Load されます。あとは、

   1  articles.first.user.face

などを実行してもSQLクエリは発行されません。 実質的に発行されるSQLは通常の:include を指定した場合と同じになるので、好きなタイミングでEager Load を実行できるようになったといえます。

posted by Png genki on Mon 4 Aug 2008 at 21:10
Contents
自分でEager Loadingが行われるタイミングを決める方法
Comments
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
tkawa: http://devcenter.heroku.com/articles/rails31_he... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ