2012-08-06 58 views
0

我正在尝试制作一个搜索页面,用户可以在其中搜索许多不同领域的项目记录。我希望他们能够在client,industry,start_date,end_datekeywords上搜索。Ruby on Rails:搜索时的优先领域

目前,该页面显示“客户”和“行业”的下拉菜单以及“关键字”的文本框,因此用户可以从数据库中进行选择并搜索关键字。

我在搜索开始日期时遇到了问题,因为我试图让用户选择在某个时间范围内(即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 = [email protected]! { |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 

回答

1

我会修改start_date_dd下降到有一个自定义字段,然后添加jQuery来显示/隐藏起始日期/ END_DATE领域。然后在您的控制器中,您可以查看是否start_date_dd是自定义字段,那么您应该使用start_date/end_date字段。

其他评论:

我不会通过他们搜寻的内容直接到数据库。我会首先运行类似以下内容:

user_supplied_start_date = Time.zone.parse(search_start_date) 

这样,如果他们给你一个无效的日期(解析user_supplied_start_date ==无),你可以给他们,你是无法解析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