2013-08-21 1 views
0

Я пытаюсь создать систему фильтрации записей с использованием областей ActiveRecord, но я застреваю в точке, где у вас есть два фильтра одной и той же модели. Я пытаюсь фильтровать продукты с brand_id: 1 и brand_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 и отправляет форму, его URL запроса выглядит следующим образом: http://localhost:3000/categories/1?&brand=1&brand=4 и запрашиваемый массив только фильтруется brand=1. Я хотел бы, чтобы результаты были отфильтрованы обоими параметрами. Является ли результирующий URL-адрес даже правильным или должен быть: http://localhost:3000/categories/1?&brand=1,4?

ответ

0

Все входные данные фильтра, которые вы отправляете, имеют одинаковые ключи параметров, brand. Таким образом, хэш параметров может иметь только одно значение для этого ключа.

Вы хотите использовать вместо 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, а не брендом.

+0

Он по-прежнему не работает, он передает 'brand_ids []' как единый параметр вместо массива brand_ids. Разве параметр не должен совпадать с именем области? –

+1

Я добавил комментарий о пределе GET при отправке параметров, после более тщательного анализа настройки формы и проблемы, с которой вы сталкиваетесь. –

+0

Ваша вторая ссылка сообщила мне, что мне нужно знать, поэтому я буду принимать ваш ответ. –

Смежные вопросы