Rails2.1の新機能、named_scopeを試してみた
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は頭がいいなあ。