我似乎无法在任何地方找到一个简单的解决方案。简单地说,我只是希望能够使用复选框过滤项目,并可以选择多个框和过滤器工作。参数输入,但结果不会出现(见下文)。
如果从视图中删除[],我可以获取单个项目进行搜索,但不能获取倍数。 []将%5B%5D
编码到URL中,我认为这是原因搜索的一部分。请有人帮忙。
控制器:
@cars = if params[:colour_category]
Car.where('colour_category LIKE ? OR design LIKE ?', "%#{params[:colour_category]}%", "%#{params[:design_category]}%")
else
Car.all
end
查看:
<%= form_tag cars_path, method: :get do %>
<%= check_box_tag('colour_category[]', "Yellow") %>
<%= check_box_tag('colour_category[]', "Blue") %>
<%= check_box_tag('design_category[]', "Luxury") %>
<%= submit_tag "Submit" %>
<% end %>
提交后服务器中的参数示例:Parameters: {"utf8"=>"✓", "colour_category"=>["Yellow", "Blue"], "commit"=>"Submit"}
答案 0 :(得分:0)
更清洁的方法,它根据params
值链接不同的范围/过滤器方法。我正在从我的一个应用程序中发布示例,您可以采用相同的概念:
module Client::Filterable
extend ActiveSupport::Concern
include PgSearch::Model
included do
scope :find_by_company, -> (company_id) { where(company_id: company_id) }
pg_search_scope :search, against: %w( name ), using: {
tsearch: { prefix: true }
}
end
class_methods do
def filter(params = {})
relation = self
relation = relation.search(params[:query]) if params.fetch(:query, false).present?
relation = relation.find_by_company(params[:company_id]) if params.fetch(:company_id, false).present?
relation.all
end
end
end
然后在您的控制器中
@clients = Client.all.filter(query: 'John Smith', company_id: 4356)
您可以在#filter
方法中添加尽可能多的过滤器选项,只有在存在相关的参数键的情况下才会应用它们。
def filter(params = {})
relation = self
relation = relation.by_color_category(params[:color_category]) if param.fetch(:color_category, false).present?
relation = relation.by_design_category(params[:design_category]) if param.fetch(:design_category, false).present?
relation.all
end