Как я могу фильтровать товары по нескольким категориям с ActiveRecord? - PullRequest
2 голосов
/ 17 апреля 2019

Я бы хотел добавить возможность фильтровать продукты по нескольким категориям в приложении электронной коммерции Rails. В настоящее время я разрешаю фильтрацию товаров по категориям, но теперь я хочу предоставить возможность фильтровать дальше.

Например, я бы хотел, чтобы пользователь мог выбрать «Мужская» и «Верхняя одежда», чтобы отображать только товары в обеих этих категориях.

Зная, что при предоставлении массива идентификаторов категорий в моем запросе Product будут найдены продукты в любой из указанных категорий, и надеясь на хорошее решение типа ActiveRecord-y, я сначала попытался добавить несколько условий categories.id в запрос, но это не сработало.

Product.joins(:categories).where(:'categories.id' => 123, :'categories.id' => 456)

В результате получилось, что первый идентификатор категории был перезаписан вторым.

И, конечно, здесь будут найдены товары в любой из категорий, а не только товары в обеих:

Product.joins(:categories).where(:'categories.id' => [123, 456])

Кроме того, нужное мне решение должно работать с произвольным числом категорий. Это может быть два, это может быть три или больше.

После некоторого исследования я не думаю, что есть хороший способ Rails-y сделать это, но я застрял в поиске действительно правильного решения.

Мое приложение работает на Rails 5.2 с MariaDB.

1 Ответ

1 голос
/ 18 апреля 2019

Исходя из комментария @ muistooshort выше, я нашел этот пост с решением, в котором я нуждался: Выбор сообщений с несколькими тегами

Обновление моего запроса, таким образом, дало те продукты, которые я хотел, во ВСЕХ указанных категорий (строки для удобства чтения):

Product.joins(:categories).where(:categories => { :id => category_ids })
    .having('count(categories.name) = ?', category_ids.size)
    .group('products.id')
...