これはRuby Advent Calendar jp: 2010の参加エントリです。前日は@sasata299さんの未経験で初めてgemを作ってみたので晒してみるでした。
始めに
ホントは私もミサワ風に「お、この話に付いてこれるんだ」的話をしたいんだけど今回はRailsのActiveRecordの機能、named_scopeの話をします。
最近twitterでnamed_scope便利!という声を見ました。Ruby on Rails 2.1から入った機能なのでそれ以前から触っていた人は使っていないのかな、ということで今更ながらnamed_scopeのおさらいをします。
named_scopeの機能
named_scopeの概要は以下のとおり
- Rails2.1以降で使える
- 検索条件をスコープごとにまとめて定義できる
- メソッドチェーン的に集合演算が可能
ではサンプル。
class Article < ActiveRecord::Base named_scope( :active, :conditions => ["deleted=?", false] ) named_scope( :public, :conditions => ["start_date >= ? and (end_date is null or end_date =< ?)", Date.today,Date.today] ) #named_scopeを使わない場合 get_active return find(:all, :conditions = ["deleted=?", false], :order => "id desc" ) end #named_scopeを使わない場合 get_article(id) return find(:first, :conditions => ["deleted=? and start_date >= ? and (end_date is null or end_date =< ? ) and id =?", false,Date.today,Date.today,id] ) end end
これらを、コントローラから呼ぶと
#named_scopeを使わない場合 articles = Article.get_active article = Article.get_article(params[:id]) #named_scopeを使った場合 articles = Article.active(:all,:order=>"id desc") article = Article.active.public.find(params[:id]) #集合演算
まとめ
業務上は論理削除や記事の掲載期間のようにお約束的に繰り返されるfind条件がたくさんでてきます。それらをnamed_scopeでDRYに用意しておくことで1.named_scope条件部分は検証済みになる安心 2.ソースの可読性向上が得られます。
例えば記事の掲載期間だけで一行ありますがfindの度に毎回出てくると、本来そのfindで得たい固有の条件、を見つけるのが苦痛になってきます。またフラグにはtrue/falseや0,1,2,99のように色々な持ち方がありますがactive,publicなどと名前を付けることで単純ミスを防げます。
更にincludeやorderなどもnamed_scope化できますし、引数を取って動的に処理することも可能です。
ゴクリ。これで今日からえ〜普通だと思ってた。named_scope使ってないで許されるの小学生までだよね?え〜そう?普通だと思ってた〜え〜それ普通だと思ってた〜と言えますね!
[…] This post was mentioned on Twitter by ysakaki and ysakaki. ysakaki said: まずはタイトルを書いた。[] http://bit.ly/efFDmT […]