0

ユーザーがさまざまなフィールドのプロジェクトレコードを検索できる検索ページを作成しようとしています。、、、、、、を検索できるようclientindustryしたいと思いstart_dateます。end_datekeywords

現在、このページには「クライアント」と「業界」のドロップダウンメニューと「キーワード」のテキストボックスが表示されているため、ユーザーはデータベースから選択してキーワードを検索できます。

ある時間スケールで「開始日」を検索するオプションをユーザーに提供しようとしているため、開始日の検索に問題があります。つまり、3日前、1週間前...ドロップダウンメニュー、またはjquerys datepickerを使用して「開始日」と「終了日」を入力し、特定の日付を検索します。

ユーザーがタイムスケールと特定の日付の両方を選択した場合に備えて、特定の日付を優先するようにしたいと思います。

これが私の検索ビューです:

    <h1>Search</h1>

<% if @project_search.total_entries > 0 %>
<%= form_tag search_path, method: :get do %>

Client :
<%= select(@projects, :client, Project.all.map {|p| [p.client]}.uniq, :prompt => "-Any-", :selected => params[:client]) %></br>

Industry :
<%= select(@projects, :industry, Project.all.map {|p| [p.industry]}.uniq, :prompt => "-Any-", :selected => params[:industry]) %></br>    

Select start date:
<%= select_tag "start_date_dd", options_for_select({
    "Select a period" => "",
      "3 days ago"   => DateTime.now.to_date - 3.days,   # =    259_200 sec.
      "1 week ago"   => DateTime.now.to_date - 1.week,   # =    604_800 sec.
      "1 month ago"  => DateTime.now.to_date - 1.month,  # =  2_592_000 sec.
      "6 months ago" => DateTime.now.to_date - 6.months, # = 15_552_000 sec.
      "1 year ago"   => DateTime.now.to_date - 1.year,   # = 31_557_600 sec.
    }, :selected=>params[:start_date_dd] )%>    

or select project dates between

<%=  text_field_tag ("start_date") %>

and

<%= text_field_tag("end_date") %></br>    

Keywords :

<%= text_field_tag :keywords, params[:keywords] %></br>

<%= submit_tag "Search", name: nil %>

<% end %>

検索で特定の日付オプションなしで機能する私のプロジェクトモデルは次のとおりです。

class Project < ActiveRecord::Base
  attr_accessible :client, :end_date, :industry, :keywords, :start_date, 


def self.search(search_client, search_industry, search_start_date_dd,  search_keywords) 
  return scoped unless search_client.present? || search_industry.present? || search_start_date_dd.present?  || search_keywords.present?

  where(['client LIKE ? AND industry LIKE ? AND DATE(start_date) BETWEEN ? AND ?  AND keywords LIKE ?', 
      "%#{search_client}%", "%#{search_industry}%" ,  
      search_start_date_dd, DateTime.now.to_date, "%#{search_keywords}%"
    ])

end


def self.paginated_for_index(projects_per_page, current_page)
    paginate(:per_page => projects_per_page, :page => current_page)
  end

end

これがプロジェクトコントローラーからの私の検索アクションです。これはタイムスケール検索のみを考慮に入れています。

def search

@search = params[:client], params[:industry], params[:start_date_dd],  params[:keywords]

@project_search = Project.search(*@search).order(sort_column + ' ' + sort_direction).paginated_for_index(per_page, page)

@search_performed = !@search.reject! { |c| c.blank? }.empty? 

   @project = Project.new(params[:project])

respond_to do |format|
      format.html # search.html.erb
      format.json { render :json => @project }
    end

end

特定の日付検索を含めようとしましたが、うまくいきませんでした。うまくいけば、誰かがそれらを正しい方向に向けることができます。私はレール初心者ですので、気楽に行ってください。前もって感謝します。

編集:これがそれを機能させるための私の試みです。

def self.search(search_client, search_industry, search_start_date_dd, search_start_date, search_end_date, search_keywords) 
  return scoped unless search_client.present? || search_industry.present? || search_start_date_dd.present? || search_start_date.present? || search_end_date.present? || search_keywords.present?

where(['client LIKE ? AND industry LIKE ? AND DATE(start_date) BETWEEN ? AND ? OR DATE(start_date) BETWEEN ? AND ? AND DATE(end_date) BETWEEN ? AND ? AND keywords LIKE ?', 
      "%#{search_client}%", "%#{search_industry}%" , search_start_date_dd, DateTime.now.to_date, search_start_date, search_end_date, search_start_date, search_end_date,"%#{search_keywords}%"
    ])

end
4

1 に答える 1

1

start_date_ddドロップダウンを変更してカスタムフィールドを作成し、jQueryを追加してstart_date/end_dateフィールドを表示/非表示にします。次に、コントローラーで、start_date_ddがカスタムフィールドであるかどうかを確認できます。次に、start_date/end_dateフィールドを使用する必要があります。

他のコメント:

彼らが検索したものをデータベースに直接渡すことはしません。私は最初に次のようなものを実行します:

user_supplied_start_date = Time.zone.parse(search_start_date)

そうすれば、無効な日付(user_supplied_start_date == nilを解析)が表示された場合、search_start_dateを解析できず、代わりに過去__日を表示しているという警告を表示できます

次のコードも見ました。

def self.search
  scoped = scoped.where(['client like %?%', params[:client]) if params[:client].present?
  scoped = scoped.where(['client like %?%', params[:industry]) if params[:industry].present?
  ...
  scoped
end

そうすれば、彼らがあなたに送ったものに基づいて検索しているのです。

現在プロジェクトに割り当てられているクライアントのみを一覧表示します。ユーザーがすべてのクライアントを検索して、 _クライアントにプロジェクトがないことを確認できるようにすべきではありませんか?

原則として、ビューにコードを含めるよりもヘルパーメソッドの方が好きです...

Project.all.map {|p| [p.client]}.uniq

vs

# app/helpers/search_helper.rb
def clients_for_select
  Client.select("id, name").map{|c| [c.id, c.name]}
end
于 2012-08-12T15:19:17.640 に答える