named_scope熱再び(需要があればRails勉強会で話します)

再びというか、リリース以来毎日もりもり使ってるんですが、named_scopeがいい感じです。
ということでこんなものを作ってみました。

http://github.com/moro/scope_do/tree/master

ここのREAMEになんちゃって英語(添削歓迎)で書いたんですが、ちょこっとした機能を提供するRailsプラグインです。いまのところ、三種類の機能があります。

named_acl

User <-(memberhip)-> Group <-(accessibility)-> 何か という構造でアクセスコントロールするためのプラギンです。UNIXグループでのアクセスコントロールをイメージしてもらうといいかと思います。readonlyとかの権限もそのうち使えるようにするかも。今のところ僕にとっての需要がないという。

chainable_scope

流れるような(笑)named_scopeを定義できるようにします。

コントローラをこんなふうにしたり、

def index
  @blogs = params[:q].blank? ? Blog.some_scope : Blog.some_scope.search(params[:q])
end

モデルで

class Blog < ActiveRecrod::Base
  named_scope :search, proc{|q|
    return {} if q.blank?

    # 本処理いろいろ
  }
end

とかを毎回書くのが面倒になったので。

has_children

has_manyとかhas_many :throughな関連で子レコードが存在するもののみ引きたい、というよくあるシーンをうまくやるnamed_scopeを定義します。

子レコードの数も指定できますが、そういえばカウンターキャッシュを使ってないなー。

Blog.has_entries.all?{|b| not b.entries.blank? }  # => true

Blog.has_entries(2).all?{|b| b.entries.size >= 2 }  # => true

というものなんですが、どうでしょう。興味のある方がいればRails勉強会で紹介します。興味のある人がいなければみんなでRackのコードを読んでみようと思います。