我想添加将多个类别的产品过滤到Rails电子商务应用程序的功能。我目前允许按类别过滤产品,但现在我想提供进一步过滤的功能。
例如,我想允许用户选择“Men's”和“Outerwear”来仅显示这两个类别的产品。
知道在我的产品查询中提供类别ID数组会找到任何指定类别的产品,并希望有一个很好的ActiveRecord-y类型解决方案,我首先尝试在查询中添加多个categories.id
条件,但这不起作用出。
Product.joins(:categories).where(:'categories.id' => 123, :'categories.id' => 456)
结果是第一个类别ID被第二个类别覆盖。
当然,这将在以下任一类别中找到产品,而不仅仅是两者中的产品:
Product.joins(:categories).where(:'categories.id' => [123, 456])
此外,我需要的解决方案应该使用任意数量的类别。可能是两个,可能是三个或更多。
在做了一些研究之后,我认为没有一个很好的Rails-y方法来做到这一点,但我仍然坚持找到真正正确的解决方案。
我的应用程序使用MariaDB运行Rails 5.2。
根据@ 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')