Railswhereとはなんぞや?
Railsで苦痛だったのが「検索」フォームの作成、それを解消してくれるのが「Railswhere」というモノらしい。
サンプルのコードをじっくりと眺めると便利な度合いが分かってきた。
#プラグインを使うぜ! w = Where.new #fieldの苗字、名前、電話、アドレス for field in [:first_name, :last_name, :phone, :email] #「w.and」でAND条件を追加する w.and('#{field} like ?', params[:search][field] + '%') unless params[:search][field].blank? end #「w.and」で追加条件を加えつつ、「sw.or」でOR条件を追加する w.and { |sw| for status in params[search][:statuses].split(',') sw.or 'status=?', status end } #コントローラー側で宣言してあげる User.find(:all, :conditions => w.to_s) #検索するときの条件式のイメージはこんな感じ # '(first_name like 'tim%') and (last_name like 'harper%') and ( (status = 'new') or (status = 'expired'))'
簡単にまとめてみる。
- w=Where.new #宣言
- w.and "field_name like ?", params[controller_name][field_name] + '%') unless params[controller_name][field_name].blank? #空白じゃなかったら、「like」で検索条件追加
- w.and "field_name = ?", params[controller_name][field_name]) if params[controller_name][field_name] != 0 #検索条件が決め打ち
- w.and{|sw|
- sw.or "条件式" #switch caseな条件式、breakは無いのかな?
- w.and_not{|ww|
- ww.or "条件式" #switch caseでNOTな条件式
んで最後
w = Where.new("id=5") y = Where.new("first_name='tim'") User.find(:all, :conditions => (w | y)) # '(id=5) OR (first_name='tim')' User.find(:all, :conditions => (w & y)) # '(id=5) AND (first_name='tim')'
組み合わせもできるらしい。
betweenがあると便利なんだけど無いっぽい。ANDでつなげるしかないのか・・・