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

76de73a1dae79a86bb99a813bd8e8e0a?s=30&d=http%3a%2f%2fkaeruspoon%.net2f2014%2fimages%2fno imageTsukasa 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は頭がいいなあ。