如何运行联接查询以仅查找包含所有has_many关系的记录?
例如:
产品有很多过滤器和过滤器有很多产品。 (product_filter_sets是两个多对多关系的连接表。)
我想运行查询以使用过滤器ID查找包含所有过滤器的产品。
目前我有这个查询
Product.joins(:product_filter_sets)
.where(:product_filter_sets => { product_filter_id: [1,2,4,5] } )
但是这将返回包含至少一个过滤器的所有产品。我想要的是包含所有过滤器的产品。
答案 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}")