2014-05-10 41 views
2

如何運行連接查詢以僅查找包含所有has_many關係的記錄?什麼ActiveRecord查詢將返回所有具有給定的has_many關係集合的所有記錄?

例如:

產品有許多過濾器和過濾器有很多產品。 (product_filter_sets是兩個多對多關係的連接表。)

我想要運行查詢來查找包含使用過濾器ID的所有過濾器的產品。

目前我有此查詢

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

但這返回包含過濾器中的至少一個的所有產品。我想要的是包含所有過濾器的產品。

回答

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}") 
相關問題