什么ActiveRecord查询将返回具有所有给定has_many关系集的所有记录?

时间:2014-05-10 21:54:08

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

如何运行联接查询以仅查找包含所有has_many关系的记录?

例如:

产品有很多过滤器和过滤器有很多产品。 (product_filter_sets是两个多对多关系的连接表。)

我想运行查询以使用过滤器ID查找包含所有过滤器的产品。

目前我有这个查询

Product.joins(:product_filter_sets)
  .where(:product_filter_sets => { product_filter_id: [1,2,4,5] } )

但是这将返回包含至少一个过滤器的所有产品。我想要的是包含所有过滤器的产品。

1 个答案:

答案 0 :(得分:1)

将产品加入过滤器,逐个产品,并选择在联接中出现多次的产品作为您指定的过滤器数量:

required_filter_ids = [1, 2, 4, 5]
Product
  .joins(:product_filter_sets)
  .where(product_filter_sets: { product_filter_id: required_filter_ids })
  .group('products.id')
  .having("count(*) = #{required_filter_ids.length}")