Rails快速找到记录,其中has_many关联与关联ID数组完全匹配

时间:2016-05-24 13:27:59

标签: mysql sql ruby-on-rails activerecord where-clause

我有一个Product模型has_many OptionValue个记录,描述colorsize等。

在我的代码中,我需要查询产品模型,其中product.option_values.pluck(:id)数组与(例如)options = [1, 6, 4]的数组完全匹配。

运行Product.includes(:option_values).where(option_values: { id: options_array })之类的内容会返回与options数组中至少一个元素匹配的所有值,而不是所有值。

我开发了一种获取我需要的记录的低效方法,如下所示:

Product.all.each { |v| return v if v.option_values.pluck(:id).sort == options_array.sort }

显然上面的方法是ott,我确信有一种更简单的方法来处理这个问题,我很高兴使用ActiveRecord或直接的SQL查询(虽然我对后者不太热,所以避风港'提出任何事情。)

关于实现这一目标的最佳方式的任何建议都非常感谢。不确定我是否完美地解释了这一点,所以如果您有任何问题请发表评论。

先谢谢,史蒂夫。

1 个答案:

答案 0 :(得分:0)

将此问题排在了我的旧问题中,并提出了一个快速简便的解决方案,因此将其放置在这里,以供可能以这种方式出现的其他任何人使用:

product_options = product.option_values.pluck(:id)
unless options_array.length < product_options.length
  (product_options & options_array).length == product_options.length
end

此:

  • 检查options_array的时间是否足以容纳必要的匹配项
  • 在两个数组((product_options & options_array))中寻找相同的元素
  • 测量它们的长度
  • 检查此长度是否与所需数组product_options相同,这意味着找到了所有必需的选项。

或者,您可以从另一个中减去一个,然后检查是否没有剩余(即丢失):

(product_options - options_array).empty?

希望这会在某个时候对某人有所帮助。