2

Railsキャストビデオhttp://railscasts.com/episodes/240-search-sort-paginate-with-ajaxを使用しています。データベースを検索するには、2つの条件を使用する必要があります。

# In my form for search 
<%= form_tag products_path, :method => 'get', :id => "products_search" do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil%>
  </p>

1つの条件では、これは正常に機能します。

# In my model product.rb
def self.search(search)
  if search
    where(name: /#{Regexp.escape(search)}/i) 
  else
    scoped
  end
end

# In my controller products_controller.rb
@products = Product.search(params[:search]).page(params[:page]).per(5)

次に、別のパラメータで検索する必要がありますrole。製品モデルに役割フィールドがあります。役割は1,2,3です。ロールが指定されている場合は、指定された入力ロールで文字列を検索する必要があります。それ以外の場合は、名前でのみ検索します。

def self.search(search,role)
            if search
where(name: /#{Regexp.escape(search)}/i)(and role: should be equal to value of role)

また、products_controller.rbでどのような変更を行う必要がありますか?そして、私の上記の検索フォームでは?

4

3 に答える 3

2

role製品モデルの一部かどうかはわかりませんが、そうである場合:

def self.search(paramsname, role = nil) 
  if role
    @products = Product.where(:name => Regexp.new(name, true), :role => role)
  else
    @products = Product.where(:name => Regexp.new(name, true))
  end
end
于 2013-01-01T19:14:35.933 に答える
2

私はそれをテストしませんでしたが、あなたの問題を見ると、責任をより適切に分離する必要があるようです。それを念頭に置いて、これらの検索フィルターを別のクラスに分離する方が簡単かもしれません。

私はこれを思いついた:

    class SearchService
        def self.perform_search(params, klass)
            search = klass.scoped
            search = search.where(:name => Regexp.new(params[:name], true)) if params[:search]
            search = search.where(:role => params[:role]) if params[:role]
            search      
        end
    end

間違っている部分もあるかもしれませんが、お分かりいただけると思います。

したがって、コントローラーでは、それを次のように使用するだけです。

    SearchService.perform_search(params, Product)

抽象化されたものはまだあまり良くありませんが、その考え方に入るには、より簡単で優れたアプローチだと思います。

お役に立てれば。

于 2013-01-09T15:40:38.843 に答える
2

フィールドをフォームに追加します。

<%= form_tag products_path, :method => 'get', :id => 'products_search' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= select_tag :role, options_for_select([1, 2, 3]) %>
    <%= submit_tag 'Search', :name => nil %>
  </p>
<% end %>

コントローラーで新しい:roleパラメーターを使用します。

@products = Product.search(params[:search], params[:role])
                   .page(params[:page]).per(5)

Product モデルで新しいroleパラメーターを使用します。

def self.search(search, role)
  q = scoped
  if search
    q = q.where(:name => Regexp.new(name, true))
  end

  if role
    q = q.where(:role => role)
  end
  q
end
于 2013-01-03T04:22:44.010 に答える