делает функцию ИЛИ с Ransack (рельсы)

Обновить

December 2018

Просмотры

1.6k раз

1

У меня есть эти два входа:

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

и когда они оба набора на «т», я получаю этот запрос выполняется:

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%')

2 ответы

0

бросить это под search_form_for тега. Это предполагает, что вы используете п:

<%= f.combinator_select %>

он будет генерировать выбор два варианта. ALL или ANY. ANY будет использовать пункт ИЛИ. ALL будет использовать условие AND.

6

Если вы не хотите, чтобы пользователь должен выбрать «любую» вариант, вы можете сделать так, что поиск всегда использует «ИЛИ», добавив что-то вроде этого в контроллере:

@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 это хорошее место , чтобы играть вокруг с различными параметрами поиска. Существует простой режим и расширенный режим. Исходный код доступен на GitHub и мнения там дают некоторое представление о том , как собрать группировку и условия.

Дополнительная информация также доступна в RailsCast 370 .