如何在Ransack获得条件组?

iCy*_*org 7 ruby-on-rails ruby-on-rails-3 ransack ruby-on-rails-4

我在Ransack中使用高级搜索,它具有默认AND.我把它作为OR通过放入.try(:merge,m:'或'))

@search = Data.search(params[:q].try(:merge, m: 'or'))
Run Code Online (Sandbox Code Playgroud)

但我无法像在Ransack Demo中显示的条件组那样得到AND/OR下拉http://ransack-demo.herokuapp.com/users/advanced_search

在此输入图像描述

如何做到这一点不幸的是Ransack wiki没有提及它.

我们的代码

data_controller.rb

def search

    @search = Data.search(params[:q])
    @datum = @search.result(:distinct=>true).paginate(page: params[:page], per_page: 10)

    if params[:q].nil?
        @datum = Prospect.where(:id => 0).paginate(page: params[:page], per_page: 10)
    end

    @page = params[:page] || 0
    @pids = @search.result(:distinct=>true).pluck(:id)

    @search.build_condition
    # @search.build_grouping unless @search.groupings.any? (I have tried this code too but this gives an error)
end
Run Code Online (Sandbox Code Playgroud)

的routes.rb

resources :data do
    collection do
      get :search
      post :search, to: 'data#search'
    end
end
Run Code Online (Sandbox Code Playgroud)

data.html.erb

<script type="text/javascript">
    var ids = <%= @pids %>;
</script>

<section class="psf">
    <div class="container">
        <h1>All Data</h1>
        <div class="row">
            <div class="col-lg-10">
                <div class="form_search">
                    <%= search_form_for @search, url: search_data_index_path, html: { method: :get, class: "data_search" } do |f| %>
                    <%= f.condition_fields do |c| %>
                    <%= render "condition_fields", f: c %>
                    <% end %>
                    <p><%= link_to_add_fields "Add Conditions", f, :condition %></p>
                    <br>
                    <div class="actions">
                        <%= f.submit "Search", :class => "btn btn-primary" %>
                    </div>
                    <% end %>
                </div>

            </div>

        </div>
        <br>
        <% if !@pids.nil? %>
        <div class="total_count"><b><%= @pids.count %> Records Found.</b></div>
        <% end %>
Run Code Online (Sandbox Code Playgroud)

mpo*_*lov 4

如果您检查高级演示,您会发现它m: 'or'被放入条件组哈希中,而不是直接放入q参数中。

实现它的最简单方法就是添加一个隐藏字段来分组字段,如下所示

<%= search_form_for @search, url: search_data_index_path, html: { method: :get, class: "data_search" } do |f| %>
  <%= f.grouping_fields do |g| %>
    <%= g.combinator_select %>
    <%= g.condition_fields do |c| %>
      <%= render "condition_fields", f: c %>
    <% end %>
  <% end %>
  <p><%= link_to_add_fields "Add Conditions", f, :condition %></p>
  <br>
  <div class="actions">
      <%= f.submit "Search", :class => "btn btn-primary" %>
  </div>
<% end %>
Run Code Online (Sandbox Code Playgroud)

另外,您还可以在此处查看演示中如何发送参数

在此输入图像描述

从图片中可以看到合并参数在g参数下

注意 如果您想要自定义any all单词值,请查看翻译模块

正如您所看到的world方法回退,I18n.translate因此在这种情况下您可以将自定义值放入en.ymlunderransack.allransack.allkey 中。