0

私のアプリには単純なRails検索が実装されています。当時は仕事をこなすだけでいいのですが、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( "title like?OR category like?AND publicized =? "、 "%" + params [:q] + "%"、 "%" + params [:q]+"を実行することもできます。 %"、'1').page(params [:page])。per(200).order("公開されたDESC ")

4

1 に答える 1

0

Form 4 フォームは冗長です。:inフォームを param として、検索語を として直接送信するラジオ ボタンを実装します: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]です。これにはヘルパー メソッドを使用し、それをインデックス ビュー テンプレートで呼び出します。これを fork して、どの結果コレクションが @results に配置されているかを知ることもできます。(検索方法に関係なく結果製品を同じ方法でレンダリングする可能性があるため、まったく知る必要がある場合。) したがって、1 つの変数を使用して結果をビューに渡すだけです。

Rails のデフォルト レンダリングを使用し、ビュー テンプレートに正しいパスがある場合 (これは暗黙的レンダリングと呼ばれます)、この部分はアクションで不要です。

# 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

お役に立てれば。

于 2012-06-17T21:58:14.817 に答える