年月日の範囲検索で年だけ入れられた値を優しく拾ってあげる
絶対美しくないのでもっときれいに作れるはずだと思うんだけどちょっとわからず。
晒すから突っ込んでくださいな気分。
yyyy年mm月dd日〜yyyy年mm月dd日みたいな範囲を検索するみたいな
フォームを作っている。
ここで年だけいれられた場合に例えば2007年〜2008年みたいな検索の仕方にして
あげるような対応を考えている。
DateTimeクラスは月日が入っていないとパラメータエラーとしてしまうので、
年が入っていて月日がない場合は強制的に1月1日にするという埋め込みを作ってみた。
ここが非常に汚らしい気がするんだけどどうすればいいのかちょっとわからず…
private def params_to_date(method_name) a = Array.new for i in 1..6 value = params["item_search"]["#{method_name}(#{i}i)"] if value == "" && a[0] != "" if(i == 2 || i == 3) value = 1 end end a.push(value) end t = DateTime.new(*(0..5).map{|i| a[i].to_i }) t.strftime("%Y-%m-%d %H:%M:%S") rescue nil end end
フォーム
<td> <%=datetime_select("item_search", "search_date_from", :use_month_numbers=> true) %> </td> <td> から</td> <td> <%= datetime_select("item_search", "search_date_to", :use_month_numbers => true) %> まで </td>
コントローラ
if date_from = params_to_date( "search_date_from") if date_to = params_to_date( "search_date_to") cond += cc{event_date <=> (date_from..date_to)} end
Ez_Where_Twoで生成したSQL
(occur_date BETWEEN ? AND ?)2007-02-04 05:13:002007-11-17 17:04:00
同じコントローラ内で使いまわすためにはparams_to_dateの引数にmodel_name
を入れる必要がある。現状#{model_name}とかになるかなと思うのだけど、悪意の
あるアクセスがあるとこれでまずい場合とかないか気にならないでもなく。
予期しないエラーになるけどシステムに危険な影響を与えないのならmodel_nameも
拾えるようにした方が使い勝手がいいと思う。