我有一个搜索栏+一个下拉列表来搜索餐馆或用餐,并且能够按类别过滤(法国食品,印度,脚等)
index.html.erb
<%= form_tag meals_path, method: 'get', id: 'products_search' do %>
<p>
<%= text_field_tag :search, params[:search] %>
<%= select_tag :search_category, options_for_select(@categories, @categories[0]) %>
<%= submit_tag "Rechercher", name: nil %>
</p>
<% end %>
meals_controller.rb
@meals_search = @meals.search(params[:search], params[:search_category])
模型/ meal.rb
def self.search(search, search_category)
if search
if search && search_category == "All"
where('name LIKE ?', "%#{search}%")
elsif search == "" && search_category != "All"
where('category = ?', "%#{search_category}%")
else
where('name LIKE ? AND category = ?', "%#{search}%", "%#{search_category}%")
end
else
all
end
end
搜索栏完美无缺,但类别过滤器(search_category)却没有。我实际上得到一个空列表,虽然你只能过滤至少有一个餐馆或餐厅的类别(所以列表不能为空)。
有什么想法吗?
答案 0 :(得分:2)
只需使用ransack,进行高级搜索和排序
答案 1 :(得分:2)
好的,按照@vishnuprakash的建议,我用ransack gem来解决我的问题:
我已将gem 'ransack'
添加到Gemfile
并运行bundle
。
然后我在index.html.erb中创建了这个表单:
<%= search_form_for @q do |f| %>
<%= f.search_field :name_cont %>
<%= f.select :category_eq, options_for_select(@categories), include_blank: true %>
<%= f.submit %>
<% end %>
和meals_controller.rb:
@q = @meals.ransack(params[:q])
@meals_search = @q.result(distinct: true)
我还摆脱了先前在model / meals.rb中创建的功能。
它现在完美无缺!如果您遇到类似问题,请随时查看the ransack dock。你也可以给我发消息,我很乐意提供帮助。
答案 2 :(得分:0)
尝试更改
where('name LIKE ? AND category = ?', "%#{search}%", "%#{search_category}%")
到
where('name LIKE ? AND category = ?', "%#{search}%", search_category)
和
where('category = ?', "%#{search_category}%")
到
where('category = ?', search_category)
%...%
语法仅适用于LIKE
,而不适用于=
。