如何使用ActiveRecord按多个类别过滤产品?

时间:2019-04-16 21:45:10

标签: ruby-on-rails activerecord rails-activerecord

我想在Rails电子商务应用程序中添加按多个类别过滤产品的功能。我目前允许按类别过滤产品,但现在我想提供进一步过滤的功能。

例如,我想允许用户选择“男士”和“外套”以仅显示这两个类别的产品。

知道在我的产品查询中提供一个类别ID的数组将找到任何指定类别的产品,并希望找到一个好的ActiveRecord-y类型的解决方案,我首先尝试在查询中添加多个categories.id条件,但这没有解决。

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

这里的结果是第一个类别ID被第二个类别ID覆盖。

当然,这将在两个类别中找到产品,而不仅仅是两个类别中的产品:

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

此外,我需要的解决方案应使用任意数量的类别。可能是两个,也可能是三个或更多。

做完一些研究后,我认为没有找到一种不错的Rails-y方法,但是我一直坚持寻找实际的正确解决方案。

我的应用程序正在使用MariaDB运行Rails 5.2。

1 个答案:

答案 0 :(得分:1)

基于上面@muistooshort的评论,我发现了这篇SO帖子以及所需的解决方案: Selecting posts with multiple tags

像这样更新我的查询后,得到了我想要的产品,这些产品属于所有指定类别(包装起来便于阅读):

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