我有这两个输入:
<%= 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%')
答案 0 :(得分:6)
如果您不希望用户必须选择“任何”选项,您可以通过在控制器中添加类似的内容来使搜索始终使用“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也提供了其他信息。
答案 1 :(得分:0)
将此内容放在search_form_for标记下。这假设您正在使用f:
<%= f.combinator_select %>
它会生成一个带有两个选项的选择。全部或任何。任何人都会使用OR条款。 ALL将使用AND子句。