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

これで曜日の検索ができた。日付の差分を取得するところがエレガントじゃないのが気に入らない。