【问题标题】:How can I filter products by multiple categories with ActiveRecord?如何使用 ActiveRecord 按多个类别过滤产品?
【发布时间】:2019-04-16 21:45:10
【问题描述】:

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

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

知道在我的产品查询中提供一个类别 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。

【问题讨论】:

  • 所以您想要 both 类别的产品?顺便说一句,:'categories.id' => 123, :'categories.id' => 456 不起作用,因为这实际上是一个 Hash 文字,并且 Hashes 不会重复键。
  • 您在寻找where(categories: { id: [123,456] })吗?
  • @Iceman 不,这将在两个类别中的任何一个中找到产品。我只需要找到两者兼有的产品。
  • @muistooshort 是的,没错。属于两个(或所有 3 个或多个)类别的产品。关于哈希键的好点;这只是我想到的第一件事,我并没有想太多为什么它不起作用。
  • @muistooshort 根据您的提示,我找到了我所需要的。我会用我的答案更新我的帖子。再次感谢。

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


【解决方案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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多