Rails 2.1.0のnamed scopeの:includeが評価されない。
以下がうまくいかないorz
class Blog < ActiveRecord::Base has_many :entries named_scope :with_entries, :include => :entries end # Blog.with_entries # select * from blogs
:joinsならうまくいくんだけどなぁー。
class Blog < ActiveRecord::Base has_many :entries named_scope :with_entries, :joins => :entries end # Blog.with_entries # select * from blogs inner join entries...
今回はinner joinでも事足りたけど、left joinしたいときに困る。なんで?
追記
- joinsを誤解してた。
- includeはモデルにフェッチしてくれるけど、:joinsはしてくれないのね。left joinかinner joinかの違いかと思っていたよ。
>yukiさん
うーん、2.1のバグなんでしょうか。
Railsに詳しい知人に聞いたところ、統計的に見て:includeで最初にフェッチするよりも、遅延ロードで取得したほうがパフォーマンスが良いという結果が出ていてこの動きをしているような話をしていました。情報のソースを聞くのを忘れてしまったので確かなことは言えないですが。
なるほど、
:include => [:xxxxx], :conditions => [”xxxxx.created_at IS NOT NULL ”]
とするとロードしてくれるんですね!知りませんでした。そこまで見るくらいなら素直にロードしてくれよ!という感じですねw
自分の場合は:orderを併用したかったのですが、
named_scope :with_entries, :include => :entries, :order => 'entries.title'
のようにしてもダメでした。バグかはともかくあまりいい動きではないですよね。