select_datetimeからの日付検索

 日付を入力するフォームを簡単に作成できるselect_date/select_datetimeというヘルパーを使って日付検索を実装しました。まだ不完全なところがありそうですが。一応、記録しておきます。

  • 期間で検索するには、select_datetimeを2回使います。なので、パラメータを区別するためにprefixオプションを使います。
  • パラメータをそのまま検索条件に使うことはできないので、mktime_from_selectというプライベートメソッドを用意して、Timeオブジェクトに変換します。
  • @fromと@toという変数を使ってパラメータを保持しておくことで、入力した日付を引き続き表示させます。select_datetimeの第1引数で表示する日付を設定できます。

View

<%= select_datetime(@from || Time.now, {:prefix => "from"}) %> 〜 
<%= select_datetime(@to || Time.now, {:prefix => "to"}) %>

Controller

def index
  conditions = []
  conditions << ["created_at>=?", mktime_from_select(params[:from])] unless params[:from][:year].empty?
  conditions << ["created_at<=?", mktime_from_select(params[:from])] unless params[:from][:year].empty?
  @users = User.find(:all, :condition => flatten_conditions(conditions))
  @from = mktime_from_select(params[:from]) || Time.now
  @to = mktime_from_select(params[:to]) || Time.now
end

private

def mktime_from_select(params)
  return false if params.nil?
  year = 0; month = 0; day = 0; hour = 0; minute = 0
  params.each do |key, val|
    case key
    when "year"
      year = val
    when "month"
      month = val
    when "day"
      day = val
    when "hour"
      hour = val
    when "minute"
      minute = val
    end
  end
  return Time.mktime(year, month, day, hour, minute)
end

※flatten_conditionsについて
http://d.hatena.ne.jp/zenpou/20080131/1201773558