スタッフブログ
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で実装するのは難しそうですが、使ってみたい機能です。
今回は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で実装するのは難しそうですが、使ってみたい機能です。