【问题标题】:doing an OR with ransack (rails)用 ransack (rails) 做 OR
【发布时间】:2013-12-05 19:55:23
【问题描述】:

我有这两个输入:

<%= search_form_for @search, url: search_path, method: :post do |f| %>
  <%= f.text_field :thing_false %>
  <%= f.text_field :thing_null %>
<% end %>

当它们都设置为“t”时,我会执行这个查询:

SQL: SELECT "stuffs".* FROM "stuffs" WHERE (("stuffs"."thing" = 'f' AND "stuffs"."thing" IS NULL))

我怎样才能让它被执行?

SQL: SELECT "stuffs".* FROM "stuffs" WHERE (("stuffs"."thing" = 'f' OR "stuffs"."thing" IS NULL))

ransack 文档并没有真正解决这个问题。这是我能找到的最接近的例子:

>> User.search(:first_name_or_last_name_cont => "Rya").result.to_sql
=> SELECT "users".* FROM "users"  WHERE ("users"."first_name" LIKE '%Rya%' 
   OR "users"."last_name" LIKE '%Rya%')

【问题讨论】:

    标签: ruby-on-rails ransack


    【解决方案1】:

    如果您不希望用户必须选择“任何”选项,您可以通过在控制器中添加类似这样的内容来使搜索始终使用“OR”:

    @search = User.search(params[:q])
    @search.combinator = "or"
    @users = @search.result
    

    您还可以创建不同的搜索字段分组,并在分组中指定适当的组合。控制器可能有类似的东西:

    @search = User.search(params[:q])
    (0..1).each do |index|
      @search.build_grouping unless @search.groupings[index]
      @search.groupings[index].combinator = "or"
    end
    @users = @search.result
    

    视图可能有类似的东西:

    <%= search_form_for @search do |f| %>
      <% @search.groupings.each.with_index do |grouping,index| %>
        <%= f.grouping_fields grouping do |g| %>
          <% if index == 0 %>
            <%#= fields for first grouping here %>
          <% end %>
          <% if index == 1 %>
            <%#= fields for second grouping here %>
          <% end %>
        <% end %>
      <% end %>
    
      <%= f.submit "Search" %>
    <% end %>
    

    RansackDemo page 是玩各种搜索选项的好地方。有简单模式和高级模式。 source code 可以在 github 上找到,那里的视图给出了一些关于如何组合分组和条件的指示。

    RailsCast 370 也提供更多信息。

    【讨论】:

      【解决方案2】:

      将其放在您的 search_form_for 标记下。这是假设您使用的是 f:

      <%= f.combinator_select %>
      

      它会生成一个带有两个选项的选择。全部或任何。 ANY 将使用 OR 子句。 ALL 将使用 AND 子句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 1970-01-01
        相关资源
        最近更新 更多