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

Rails 2.1 Eager Loading

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

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

ActiveReco rd::Baseクラスのprotectedメソッド ActiveReco rd.preload _associati ons を利用します。

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

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

1 articles. first . user . face