使用rails中的Scope进行过滤

时间:2013-08-21 16:53:59

标签: ruby-on-rails ruby activerecord filtering

我正在尝试使用ActiveRecord示波器创建一个记录过滤系统,但我遇到了两个相同模型的过滤器。我正在尝试使用brand_id: 1brand_id:2

过滤产品

定义了Product范围的brand模型如下所示:

class Product < ActiveRecord::Base
  belongs_to :brand

  scope :brand, lambda{|brand| where('brand_id = ?', brand )}
end

我正在尝试过滤categories/show视图中的产品,CategoriesController看起来像这样:

class CategoriesController < ApplicationController
  has_scope :brand

  def show
    @category = Category.find(params[:id])
    @products_by_category = apply_scopes(Product).where(category_id: @category).load
    @brands = @category.brands
  end
end

categories/show视图如下所示:

<% @products_by_category.each do |product| %>
  <h2><%= product.name %></h2>
<% end %>

我正在使用此表单进行过滤:

<%= form_tag @category_path, method: get do %>
  <% @brands.each do |brand| %>
    <span class="filter_name"><%= brand.name%>:</span>
    <span> <%= check_box_tag :brand, brand.id, false,
                                     class: 'filter_check_box' %> </span>

   <% end %>
  <%=submit_tag 'filter'%>
<% end %>

问题是当我在check_boxes中选择多个品牌时,它只使用第一个参数过滤产品;

例如,如果我使用:id 1:id 2的品牌进行过滤并提交表单, 它请求网址如下所示:http://localhost:3000/categories/1?&brand=1&brand=4 并且查询的数组仅使用brand=1进行过滤。我希望结果可以通过两个参数进行过滤。结果网址是否正确或应该是: http://localhost:3000/categories/1?&brand=1,4

1 个答案:

答案 0 :(得分:0)

您提交的所有过滤器输入都具有相同的参数键brand。因此,参数hash只能为该键提供一个值。

您想使用check_box_tag代替'brand_ids[]'

<%= check_box_tag 'brand_ids[]', brand.id, false, class: 'filter_check_box' %>

最后,这很重要,您无法通过GET操作向参数发送数组。您需要使用POST。如下面的第二个链接所示,这是HTTP的限制,而不是Rails。

另见:

<强>除了

为了便于阅读和维护代码,我谦虚地建议您引用名称更一致的变量。如果您使用的是brand_id,就像在该产品范围中一样,将其称为brand_id,而不是品牌。