今から始める地獄のnamed_scope

これは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使ってないで許されるの小学生までだよね?え〜そう?普通だと思ってた〜え〜それ普通だと思ってた〜と言えますね!
地「お、この話についてこれるんだー」

One Response to “今から始める地獄のnamed_scope”