いつの間にかRuby on Rails 2.1がリリースされていました。
これは試さねばと、gem update rails -yと実行するとrails 2.1.0がお目見え。とりあえず、他のリリースノートを見ていくと、named_scopeという新機能。・・・こ、これは!
さようならbuild_condition
私の場合、これまでは検索条件は各コントローラでbuild_conditionというメソッドを用意し、そこで管理するという実装ポリシーでした。例えばこんな感じ。
def build_condition
conditions = Array.new
if (params['price'] && params['price'] != '')
conditions << "products.price < '#{params['price']}'"
end
conditions.join(' and ')
end
まぁ、複数条件を指定したい場合や、修正箇所を1か所にできるなどを考えて、美しくないと思いながらもこのような実装をしていました。このコードは例えば任意の価格未満の商品を探すといったものです。
しかし、実際は10,000円未満の商品は?といった探し方、つまり価格帯で探すのが、世のオンラインショッピングにおけるUIパターンの基本です。
10,000円未満の商品が欲しい
この要望をnamed_scopeによって実現します。まずは、model/product.rb
named_scope :below_10000, :conditions => ["products.price < 10000"]
#controllers/products_controller.rbでの呼び出し
@products = Product.below_10000
商品名でキーワード検索したい
named_scope :by_keyword, lambda {|*args|
{:conditions => ["products.name like ?", '%' + args.first + '%']}}
#controllers/products_controller.rbでの呼び出し
@products = Product.by_keyword("Rails")
デフォルトの並びは商品の新着順にしておきたい
named_scope :order_default, :order => "products.created_at desc"
#controllers/products_controller.rbでの呼び出し
@products = Product.order_default
10,000円未満の商品を新着順に並べたい
@products = Product.below_10000.order_default
す、スマートすぎる・・・MVCアーキテクチャにおいて、知りあい関係をどう分担するかが肝となりますが、RailsにおけるModelはO/RマッピングにおけるEntityつまりDB上の1テーブルに対する実態とDAOの基本機能という存在でした。
結局のところ、検索・登録・更新・削除といった基本メソッドをもったところで、サービスの中心である「検索条件」という点についてはコントローラ側の役割と私は解釈していました。
しかし、これでControllerの役割であるユーザ入力からModelへのデータ引き渡しという本来の姿により近くなることができました。Modelの役割が増えたと考えるか、DAOとしての機能がModelに収まるので分業化が楽と考えるかはMVCアーキテクチャに対する解釈によりけりでしょうね。
ただ、実装側からすれば、より直観的な方法で実装できる分、嬉しいですね。
#2008/06/06 追記
orderに関する記述とconditionsに関する記述の順番が入れ替わっても平気だった
@products = Product.order_default.below_10000
ここはLinqより頭いいです。素晴らしい。
#2008/06/08 追記
:includeと:conditionsが併用できました。申し分ありません。
named_scope :by_genre, lambda {|*args|
{:include => [:genres], :conditions => ["genres.uri = ?", args.first]}}
ほぼ完全にSQLをcontrollerに記述しなくてよいです。modelはDAOとvalidationがメインということで大分すっきりしました。
[concrete5.6] ローカルで作成したDesigner Content Proのブロックを本番へ移行する
2016年3月24日
cocrete5の強力なプラグイン、Designer Content Proで作成したブロックをローカルから本番環境へ移行するためのポイントを備忘録としてまとめました。
0 Comments1 Minute
[WordPress]寄稿者ユーザーに他者の投稿を表示させない方法
2015年4月9日
寄稿者ユーザーに他者の投稿を表示させない方法について備忘録としてまとめました。フィルターフックとアクションフックを併用して、管理画面の投稿一覧に関する表示制御を行っています。
2 Comments1 Minute
OSX Marvericks にアップデートしたら MAMP PRO が動かなくなった
2013年11月2日
OSX Marverics(以下、Marvericks)になって、便利な機能も増えましたが恒例のごとく「今まで動いていたものが動かない!」というケースも発生したりします。今回は、MAMP PROがそれになったので対処法をメモとして残しておきます。
0 Comments1 Minutes
Guard + Compass + Foundation で環境構築メモ
2013年7月5日
フロントエンド開発でもCUIベースでのビルドツールが充実してきています。RubyベースのGuardで複数のリソースを扱う方法についてメモをまとめました。
0 Comments1 Minutes
RubyでYoutube Data APIの認証、動画検索、取得、更新
2013年2月28日
RubyからGoogle Data APIを操作するバッチを書いていたので、おさらいです。APIとのやりとりを直接書いてみると、マッシュアップ系のWebサービスを作るときの基礎練習として良いですね。
0 Comments2 Minutes
HTTPでXMLを送信したら、The Processing Instruction Target Matching “[xX][mM][lL]” is Not Allowed
2013年2月27日
Rubyで次々とXML送信するバッチスクリプトを書いていたところ、Net::HTTP#putの利用時にステータス400。ふたを開けてみると、なんということはない内容でした。
0 Comments1 Minute
Sublime Text 2 + MAMP + Xdebug でPHPデバッグをする方法
2012年12月18日
Sublime Text 2(以下、ST2)がすっかりメインエディタに定着したのですが、デバッグ環境が未整理でした。そういえば・・・と思って探してみると、やはりプラグインがありました。ST2とMAMPによるPHPデバッグ環境の導入方法を解説します。
0 Comments1 Minutes
IE9でprototype.js + Shadowbox.jsを使う場合のメモ
2012年6月5日
IE9なら、モダンブラウザに近づくから面倒なIE対応は減るはず、というのは幻想で余計に手間が増えるケースもあります。今回は限定されたシチュエーションですが、JavaScriptライブラリを使う場合の対応をまとめました。
0 Comments1 Minute
[FuelPHP] taskでRailsライクなseedを作る
2012年2月22日
FuelPHPを使い始めているのですが、良いと評価できる点にコマンドラインから実行できる便利なタスクがあります。Railsではrake, railsというコマンドで各種タスクを実行でき、それを踏襲しています。今回はその中でも初期データ作成に便利なseedという機能をFuelPHP上に作ってみました。
0 Comments1 Minute