Railsで曜日検索する
曜日でガラリと変わる環境なので、曜日検索がしたい。
DBに登録しているのは
- 開始日時:dtstart(datetime型)
- 終了日時:dtend(datetime型)
検索フォームは
- 開始日時:@dtstart(date型)
- 終了日時:@dtend(date型)
- 曜日:@weekday(0が日曜日〜6が土曜日なセレクトボックス)
表示部分
app/views/iftb/search.rhtml
<%= date_select(:iftb_cond, :dtstart, {:use_month_numbers=>true}) %> <%= date_select(:iftb_cond, :dtend, {:use_month_numbers=>true}) %> <%= select(:iftb_cond, :weekday, [["すべて", ""]] + Iftb::WEEK) %>
値
app/models/iftb.cond
WEEK = [ ["日","0"], ["月","1"], ["火","2"], ["水","3"], ["木","4"], ["金","5"], ["土","6"] ].freeze
検索するパラメータをセットするところ
http://code.google.com/p/railswhere/を使っています
#曜日検索なり if @weekday.blank? w.and("dtstart >= ?", @dtstart.to_s) w.and("dtend <= ?", (@dtend+ 1).to_s) else # 曜日によって差分の日付の取得方法が異なる if Date.today.wday > @weekday.to_i lastweekday = Date.today.wday - @weekday.to_i elsif Date.today.wday < @weekday.to_i lastweekday = Date.today.wday + 7 - @weekday.to_i else lastweekday = 0 # 同じ曜日 end chkweekday = Date.today - lastweekday #目的の曜日の最終日を求める while chkweekday >= @dtstart #日付を作る w.or{ |sw| #登録済みのデータが日時型なので、強引な手法をとる sw.and "dtstart > ?", chkweekday -1 sw.and "dtstart < ?", chkweekday +1 } chkweekday = chkweekday - 7 end end w.to_s
これで曜日の検索ができた。日付の差分を取得するところがエレガントじゃないのが気に入らない。