スタッフブログ

  • 最新配信
  • RSS

Ruby On Rails2.1のnamed_scope

 : 技術全般 2008/7/6 16:00

Blogger's Avatar

satoです。
今回はRuby On Rails2.1に実装された、named_scopeについて紹介したいと思います。
個人的に他のO/Rマッパーにも取り込んでほしい機能だと思っています。

例えば、以下のようなテーブルがあったとします。
・ID
・名前
・年齢
・性別
・都道府県

このテーブルから、次のような取得条件があるとします。
1.年齢が20歳の人
2.性別が女性
3.年齢が20歳かつ性別が女性

この条件3は、条件1と条件2の組み合わせなので、共通化できそうです。PHPでSQLを組み立てるなら、
$sql = 'select * from people where ';
$where = '';
if ($age == 20) {
    $where .= ' age = 20';
}
if ($sex == FEMALE) {
    if ($where != '') {
        $where .= ' and ';
    }
    $where .= ' sex = '.FEMALE;
}
$sql .= $where;
みたいな感じで、見通しが悪くなります。(実際はwhereを生成するような関数を作ると思いますが)

Criteria系のO/Rマッパー(XoopsObjectとか)だと、
$c =& new CriteriaCompo();
if ($age == 20) {
    $c->add(new Criteria('age', 20));
}
if ($sex == FEMALE) {
    $c->add(new Criteria('sex', FEMALE));
}
少しは簡潔になりました。
もちろん、Criteriaを実処理の部分に書いてもいいですが、Criteriaを組み立てる部分が冗長なので、通常は別関数とかメソッドとかにすると思います。(XOOPSならhandlerに書くのがいいと思います)

さて、これがnamed_scopeになると、
People.age_20.female
これだけです。
もちろんこれは複合で取得する場合で、単体なら
People.age_20
People.female
というような処理になると思います。
age_20とfemaleを書くだけで、複合した際の処理を気にせず組み立てることができます。

定義はこんな感じになると思います。
class Person < ActiveRecord::Base
  named_scope :age_20, :conditions => {:age => 20 }
  named_scope :female, :conditions => {:sex => FEMALE }
end

※これらのコードは実際に動作させてないので、動くかどうかの保証はありません。

ORの場合がどうなるかは調べてないのですが、メソッドチェーンで条件を組み立てれるのは、Ruby的で面白いと思いました。
PHPで実装するのは難しそうですが、使ってみたい機能です。

トラックバック

スタッフブログ最新
カテゴリ一覧

〒104-0061 東京都中央区銀座1丁目3番3号 G1ビル7階
お問い合わせ TEL 03-3524-8860

Copyright(c) 2012 RYUS.All Rights Reserved.