ARのWhere句を構築してくれるEz-Where pluginの次期版が良さげ

ARではWhere句を構築するのに結構手間がかかるので、いくつかpluginが公開されている。
http://d.hatena.ne.jp/yukiwata/20070524/1179977530


とは言うものの、どれも機能的には貧弱に見えたのでこれだったら我慢して直で書いちゃおうかな、と思っていたらez_where_twoと言うEz-Where pluginの次期版を発見した。
http://opensvn.csie.org/ezra/rails/ez_where_two


公式ブログで言及されているわけでもないので、チーム内や作者だけが使っている秘密のブツなのかも。公開すればいいのに。
READMEを読んでみるとかなり良さげだったので試してみる事に。

ruby script/plugin install http://opensvn.csie.org/ezra/rails/ez_where_two/

READMEのサンプルコードを若干修正したら動いた。
ANDとORの優先順位を認識し、括弧付けしてくれるのが素敵だ。

cond = Caboose::EZ::Condition.new
cond += cc { name == 'fab' } + cc { login =~ 'loob%' } # AND - AND
cond -= cc { age < 20 } | cc { login_count < 10 }      # AND NOT - OR
cond |= cc { login == 'admin' }                        # OR - 
cond += { :color => 'red' }
cond.to_sql
=> ["(((((name = ?) AND (login LIKE ?))) AND NOT ((age < ?) OR (login_count < ?))) 
OR (login = ?)) AND (color = ?)", "fab", "loob%", 20, 10, "admin", "red"]

個人的に高評価だったは、Where Pluginと違ってnewしただけの状態でto_sqlを呼ぶとnilが返る点。

cond = Caboose::EZ::Condition.new
cond.to_sql #=> nil

検索画面などで動的に検索項目を切り替える場合、何も入力しなかった場合は全件ヒットするのが一般的なUIだと思う。
:conditionsにnilを渡すと全件ヒットするのでこの方が都合が良い。


他にもREADMEに色々書いてあるので参考にしよう。
もうちょっと使い込んでみてまた再評価したい。