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のコードを読んでみようと思います。