我想在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。
答案 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')