Rails2.1の新機能、named_scopeを試してみた

Tsukasa OISHI

okyuuにコメントしてくれた人に教えてもらったのだけど、Rails2.1のARにはnamed_scopeという機能が追加されたらしい。
というわけでさっそくRails2.1にアップデートして どこでもお気に入りで試してみた。

class Category < ActiveRecord::Base
  DEFAULT_NAME = "無分類"
  named_scope :default, :conditions => {:title => DEFAULT_NAME}
end

とモデルに書いておけば、

  @category = @user.categories.default.first

こう書けます。これは、

  @category = @user.categories.find(:first, :conditions => ["title = ?", Category::DEFAULT_NAME])

と同じ意味です。これはコードがすっきりしていいですね。
ブロックを使えば、値を動的に変化させることもできます。

  named_scope :title_select, lambda {|t| {:conditions => ["title = ?", t]}}

こうしておけば、

  @category = @user.categories.title_select(Category::DEFAULT_NAME).first

こう書けるのです。
named_scopeはfind(:all)として働くようなので、配列が返ってくる点に注意しなければなりません。
ちなみに、上のコードだとSQL文には「limit 1」が付与されていた。firstまで見てSQL文を構築しているのか。Railsは頭がいいなあ。