【发布时间】:2016-05-24 13:27:58
【问题描述】:
我有一个Product 模型,其中has_many OptionValue 记录,描述color、size 等。
在我的代码中,我需要查询 product.option_values.pluck(:id) 数组与(例如)options = [1, 6, 4] 数组完全匹配的 Product 模型。
运行Product.includes(:option_values).where(option_values: { id: options_array }) 之类的操作会返回与选项数组中至少一个元素匹配的所有值,而不是所有值。
我开发了一种获取所需记录的低效方法,如下所示:
Product.all.each { |v| return v if v.option_values.pluck(:id).sort == options_array.sort }
显然,上述方法很糟糕,我确信有一种更简单的方法来处理这个问题,我很高兴使用 ActiveRecord 或直接 SQL 查询(尽管我对后者不太感兴趣,所以没有'还没想出什么)。
任何关于实现这一目标的最佳方式的建议都非常感谢。不确定我是否已经完美地解释了这一点,所以如果您有任何问题,请发表评论。
在此先感谢史蒂夫。
【问题讨论】:
-
如果产品有选项 [1,4,6,9] 并且您的搜索条件是 [1,4,6],会发生什么?是否匹配(因为该产品包含您搜索的所有条件)?还是不匹配(因为该产品至少有一个您没有搜索过的 OptionValue)?
-
@MatBailie - 感谢您的快速回复。我正在查看 exact 匹配项,因此该方案不应返回产品。
-
我不知道 RubyOnRails 表示法,但 SQL 是直截了当的
SELECT o.product_id FROM OptionValue o WHERE o.option_id IN (1,4,6) GROUP BY o.product_id HAVING COUNT(*) = 3 -
@SRack 我需要类似的东西。您找到的解决方案是什么
标签: mysql sql ruby-on-rails activerecord where-clause