使用多个参数过滤Rails 5模型

时间:2018-01-22 03:26:24

标签: ruby-on-rails ruby-on-rails-5

我的应用程序有数百种产品。我创建了一个简单的过滤搜索栏,它适用于单个参数,但我想添加多个参数并返回包含其中一个搜索参数的任何产品。

这是我的单个参数的工作代码;我会展示我尝试添加多个参数的内容,但我有点超出我的深度。

products_controller.rb

def index
    @products = Product.all.order('LOWER(name)')
    if params[:q]
      @products = Product.where('name ILIKE ?', "%#{params[:q]}%").all.order('LOWER(name)')
    end
end

_searchbar.html.erb

<div class="form-inline">
  <%= form_tag(products_path, :method => "get", id: 'search-form', :html => {class: 'form'}) do %>
      <div class="form-group">
        <%= text_field_tag :q, params[:q], placeholder: 'Product Name', class: 'form-control' %>
      </div>
      <%= submit_tag 'Search', class: 'btn btn-primary' %>
  <% end %>
</div>

3 个答案:

答案 0 :(得分:0)

尝试以下方法:

signInWithRedirect

答案 1 :(得分:0)

我们应该知道背后的操作。 sql查询必须是这样的:

select * from products where name ilike '%name1%' or name ilike '%name2%';

根据你的代码:

select * from products where name ilike '%name1,name2%' 

这是不正确的。

答案 2 :(得分:0)

您可以使用以下步骤执行此操作,例如,如果您需要使用输入字段,则表单如下所示

<div class="form-inline">
    <%= form_tag(products_path, :method => "get", id: 'search-form', :html => {class: 'form'}) do %>
        <div class="form-group">
            <%= text_field_tag :x, params[:x], placeholder: 'Product Name1', class: 'form-control' %>
        </div>
        <div class="form-group">
            <%= text_field_tag :y, params[:y], placeholder: 'Product Name2', class: 'form-control' %>
        </div>
        <div class="form-group">
            <%= text_field_tag :z, params[:z], placeholder: 'Product Name3', class: 'form-control' %>
        </div>
        <%= submit_tag 'Search', class: 'btn btn-primary' %>
    <% end %>
</div>

或者你需要这个过滤键在复选框中,然后表单看起来像这样

<%= form_tag(products_path, :method => "get", id: 'search-form', :html => {class: 'form'}) do %>
    <%= check_box_tag("x[]", "x") %> Xname
    <%= check_box_tag("y[]", "y") %> Yname
    <%= check_box_tag("z[]", "z") %> Zname
    <%= submit_tag 'Search', class: 'btn btn-primary' %>
<% end %>

现在更新控制器看起来像这样

if params[:x] || params[:y] || params[:z]
    @products = Product.where('true')
    @products = @products.where('name ILIKE ?', "%#{params[:x]}%") unless params[:x].blank?
    @products = @products.where('name ILIKE ?', "%#{params[:y]}%") unless params[:y].blank?
    @products = @products.where('name ILIKE ?', "%#{params[:z]}%") unless params[:z].blank?
    @products = @products.order('LOWER(name)')
else
    @products = Product.all.order('LOWER(name)')
end

希望有所帮助