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でつなげるしかないのか・・・