У меня сложная проблема с фильтрацией в приложении Rails. Пользователь хочет фильтровать элементы, используя теги. Это не проблема, я просто использую именованную область. Но теги поставляются в ящиках, из которых пользователь может выбирать, например:
Size
[XS]
[S]
Color
[Red]
[Blue]
Теги находятся в "tagsets", один набор для многих тегов.
Мой вопрос: как объединить несколько запросов фильтра, когда пользователь хочет сузить поиск?
Когда пользователь выбирает XS из первого поля, он должен отфильтровать набор результатов только по этому тегу. Когда пользователь выбирает XS и S, мы добавляем фильтр и получаем больше результатов. Все еще не проблема с именованной областью. Но что, если пользователь захочет отфильтровать XS и S, а затем красный цвет из второго поля? Вот когда все становится неоправданно - я не могу просто добавить другой Item.by_tag ("tagname") для этого тега, это должен быть фильтр тегов для результатов, которые у меня уже есть, сужая результаты вниз.
Несколько флажков в одном и том же поле набора тегов - больше результатов. Проверка в другом поле tagset - меньше результатов. Я попытался сделать один SELECT для каждого блока tagset, а затем объединить наборы результатов в ruby, чтобы показать только совпадения, которые были во всех наборах, но это нарушает нумерацию страниц, поскольку я никогда не знаю, сколько результатов будет возвращено. Такое ощущение, что это должен быть один запрос, и, возможно, это какое-то соединение, но я не очень хорош в SQL и не могу понять. Вот как выглядят соответствующие части схемы:
create_table "items" do |t|
t.string "title"
end
create_table "items_tags", :id => false do |t|
t.integer "item_id"
t.integer "tag_id"
end
create_table "tags" do |t|
t.string "title"
t.integer "tagset_id"
end
create_table "tagsets" do |t|
t.string "title"
end