У меня сложная проблема с фильтрацией в моем приложении Rails. Пользователь хочет фильтровать элементы с помощью тегов. Это не проблема, я просто использую именованную область. Но теги находятся в полях, из которых пользователь может выбирать, например:
Size
[XS]
[S]
Color
[Red]
[Blue]
Теги находятся в «наборах тегов», один набор тегов для многих тегов.
Мой вопрос: как я могу объединить несколько запросов фильтра, когда пользователь хочет сузить поиск?
Когда пользователь выбирает XS из первого поля, он должен фильтровать набор результатов только по этому тегу. Когда пользователь выбирает XS и S, мы добавляем фильтр и получаем больше результатов. Все еще не проблема с именованной областью. Но что, если пользователь хочет отфильтровать XS и S, а затем красный цвет из второго поля? Вот когда все становится сложно - я не могу просто добавить еще один Item.by_tag("tagname") для этого тега, это должен быть фильтр тегов для результатов, которые у меня уже есть, сужая результаты.
Несколько флажков в одном поле набора тегов — больше результатов. Флажок в другом поле набора тегов — меньше результатов. Я попытался выполнить один SELECT для каждого поля набора тегов, а затем объединить наборы результатов в 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