2012-06-17 45 views
0

我在我的应用程序中实现了一个简单的导轨搜索。当时我做到了,我只需要完成这项工作,但我确信我做这件事的方式远非DRY,因此对于如何改进这一点的任何建议将不胜感激。我基本上想要一个搜索文本框,用4个单选按钮来选择他们想要搜索的内容。带有单选按钮的导轨搜索表单以选择搜索条件

我目前的指数:

<%= form_tag("/search", :method => "get") do %> 
    <%= label_tag(:q, "Search for Product Title:") %> 
    <%= text_field_tag(:q) %> 
    <%= submit_tag("Search Title") %> 
<% end %> 
<br> 
<%= form_tag("/search", :method => "get") do %> 
    <%= label_tag(:d, "Search for Product Description:") %> 
    <%= text_field_tag(:d) %> 
    <%= submit_tag("Search Description") %> 
<% end %> 
<br> 
<%= form_tag("/search", :method => "get") do %> 
    <%= label_tag(:a, "Search for Category Names:") %> 
    <%= text_field_tag(:a) %> 
    <%= submit_tag("Search Category Name") %> 
<% end %> 
<br> 
<%= form_tag("/search", :method => "get") do %> 
    <%= label_tag(:i, "Search for ID Str:") %> 
    <%= text_field_tag(:i) %> 
    <%= submit_tag("Search ID Str") %> 
<% end %> 

<<results from search here>> 

控制器:

class SearchController < ApplicationController 

    def index 
    if params[:commit] == "Search Title" 
     # Great, now lets figure out what sort of query we're after 
     @searchQuery_title = params[:q] 
     @resultsReceived_title = true 
     if 
     @sqlResults_title_published_size = Product.where("title like ? AND published like ?", "%" + params[:q] + "%", '1') 
     @sqlResults_title_size = Product.where("title like ? OR categories like ?", "%" + params[:q] + "%", "%" + params[:q] + "%") 
     @sqlResults_title = Product.where("title like ? OR categories like ?", "%" + params[:q] + "%", "%" + params[:q] + "%").page(params[:page]).per(200).order("published DESC") 
     end 
    else 
     @resultsReceived_title = false 
     @sqlResults_title = [] 
    end 

    if params[:commit] == "Search Description" 
     # Great, now lets figure out what sort of query we're after 
     @searchQuery_descr = params[:d] 
     @resultsReceived_descr = true 
     if 
      @sqlResults_descr_published_size = Product.where("long_descr like ? AND published = ?", "%" + params[:d] + "%", '1') 
      @sqlResults_descr_size = Product.where("long_descr like ?", "%" + params[:d] + "%") 
      @sqlResults_descr = Product.where("long_descr like ?", "%" + params[:d] + "%").page(params[:page]).per(200).order("published DESC") 
     end 
     else 
     @resultsReceived_descr = false 
     @sqlResults_descr = [] 
     end 

     if params[:commit] == "Search Category Name" 
      # Great, now lets figure out what sort of query we're after 
      @searchQuery_cat = params[:a] 
      @resultsReceived_cat = true 
      if 
      @sqlResults_cat_published_size = Product.where("category_names like ? AND published = ?", "%" + params[:a] + "%", '1') 
      @sqlResults_cat_size = Product.where("category_names like ?", "%" + params[:a] + "%") 
      @sqlResults_cat = Product.where("category_names like ?", "%" + params[:a] + "%").page(params[:page]).per(200).order("published DESC") 
      end 
     else 
      @resultsReceived_cat = false 
      @sqlResults_cat = [] 
     end 

     if params[:commit] == "Search ID Str" 
      # Great, now lets figure out what sort of query we're after 
      @searchQuery_idstr = params[:i] 
      @resultsReceived_idstr = true 
      if 
       @sqlResults_idstr_published_size = Product.where("id_str like ? AND published = ?", "%" + params[:i] + "%", '1') 
       @sqlResults_idstr_size = Product.where("id_str like ?", "%" + params[:i] + "%") 
       @sqlResults_idstr = Product.where("id_str like ?", "%" + params[:i] + "%").page(params[:page]).per(200).order("published DESC") 
      end 
      else 
      @resultsReceived_idstr = false 
      @sqlResults_idstr = [] 
      end 

    # Render the page when we're done. 
    respond_to do |format| 
     format.html 
    end 

    end 
end 

而且是有可能做一个Product.where( “???标题,如OR类别,如并公布=” ,“%”+ params [:q] +“%”,“%”+ params [:q] +“%”,'1').page(params [:page])。per(200)。 order(“published DESC”)

回答

0

表格 4种形式是多余的。使用参数:in和搜索项:q直接发送表单中的单选按钮。

<%= form_tag("/search", :method => "get") do %> 
    <%= label_tag(:q, "Search:") %> 
    <%= text_field_tag(:q) %> 
    <% [ 'product title', 'product description', 'categories', 'ID string' ].each do |in| %> 
    <br> 
    <%= radio_button_tag 'in', in %> 
    <%= in.humanize %> 
    <% end %> 
    <%= submit_tag("Search") %> 
<% end %> 

如果你坚持把不同的按钮文本各类型的搜索,请使用单选按钮一个JavaScript钩子去改变它。

控制器。 在模型中将搜索抽象为命名范围(请参见下文)。由于每种类型的搜索都收集相同的产品型号实例,因此在Product上定义整个搜索范围的最佳做法是。然后你的控制器看起来像:

def index 
    @result_scope = Product.search(params[:in],params[:q]) 
    @results = @result.page(params[:page]).per(200).order("published DESC") 
    @results_size = @result.count 
    @results_published_size = @result.published.size 
end 

我省略resultreceived等变量,因为可以在知道params[:in]的观点来制定。为此使用一个辅助方法,然后在你的索引视图模板中调用它。您也可以通过分析来了解哪些结果集放入了@results。 (如果你需要知道的话,因为无论我如何搜索它们,可能都会以相同的方式呈现结果产品。)所以我只用一个变量将结果传递给视图。如果您使用的轨道默认渲染

这部分是在动作不必要的和您的视图模板具有正确的道路(这就是所谓的隐式渲染):

# Render the page when we're done. 
respond_to do |format| 
    format.html 
end 

模式

class Pruduct < ActiveRecord::Base 
    # ... 
    scope :search, lambda { |q,in| 
    #... 
    } 
    scope :published, where(published: true) 
end 

希望这可以帮助。