搜索过滤标准下拉列表

时间:2018-01-12 10:08:36

标签: ruby-on-rails ransack

我在Rails 5和MySQL中使用当前版本的Ransack gem,并希望实现一个搜索表单,其中我可以有两个选择字段:

1)第一个下拉列表选择列表应该包含表列属性,例如。 first_name,last_name,street

2)第二个下拉列表选择列表应该包含运算符,如"等于","不是","包含"

然后是搜索关键字和提交按钮的输入字段。

在代码中它应该看起来像这样:

<%= search_form_for @search do |f| %>
  <%= f.select :select_criteria, options_for_select([
        ['first name', :first_name], 
        ['last name', :last_name], 
        ['street', :street]
        ]), @search.select_criteria %>
  <%= f.select :operator, options_for_select([
      ['contains', :contains], 
      ['is not', :is_not], 
      ['equals', :equals]
      ]), @search.operator %>
  <%= f.search_field :term %>
  <%= f.submit "filter" %>
<% end %>

但我无法在搜索此案例的ransack文档中找到任何示例。

它看起来怎么样?

1 个答案:

答案 0 :(得分:3)

尝试这样的事情。我在一个应用程序中使用过它。这使用了ransack演示应用程序中显示的技术。

<%= search_form_for @search do |f| %>
  <%= f.grouping_fields(f.object.new_grouping) do |g| %>
    <%= g.condition_fields(g.object.new_condition) do |c| %>
      <%= c.attribute_fields do |a| %>
        <%= a.attribute_select only: %i(id) %>
      <% end %>
      <%= c.predicate_select only: %i(cont not_eq eq) %>
      <%= c.value_fields do |v| %>
        <%= v.text_field :value %>
      <% end %>
    <% end %>
  <% end %>
  <%= f.submit "filter" %>
<% end %>

Ransack可以采取一系列条件并立即搜索所有条件。在您的情况下,您可以为一个组提供一个条件。我知道这看起来相当冗长,但我不确定是否有一个更简单的搜索方法(虽然可能有一个)。

我说这里的关键行是f.grouping_fields(f.object.new_grouping)g.condition_fields(g.object.new_condition)。这些工作类似于fields_for,因为您需要为块提供至少一个分组设置才能呈现任何内容。

您可以阅读有关谓词here的完整文档。可以将这些值提供给only中的c.predicate_select选项。如果需要,您也可以非常轻松地构建custom predicates

hansack的良好文档来源是ransack demo app。例如,这里是how they build an advanced search form。您还可以查看live demo of advanced search

这是高级搜索演示的屏幕截图。它看起来与你想要实现的相似。

Example of ransack advanced search