2011-06-29 17 views
2

OK,題目並不好......AR 3範圍上HBTM關係檢索元素相匹配的所有ID

這裏是例子:

class Product 
    has_and_belongs_to_many :categories 
end 

我想創建一個作用域返回包含我作爲參數發送的所有類別ID的產品。如果我使用Product.includes(:categories).where(:「categories.categorie_id」=> [1,2,3,4]),它會爲我提供所有具有1,2,3,4類別的產品。 ,4. 我想產品至少有我發送的所有類別作爲參數。

例如:

Product.with_all_categories([1, 2, 3, 4]) # => get all the Product that have categories 1, 2, 3 AND 4 (at least, it could be more). 

回答

1

我想你不會喜歡的答案:這是不容易的。

AFAIK,它不是東西,你可以在AR直接做。你必須經過find_by_sql。您需要的請求類似於:

SELECT products.* FROM products 
INNER JOIN categories_products cat1 ON products.id = 
cat1.product_id 
INNER JOIN categories_products cat2 ON products.id = 
cat2.product_id 
INNER JOIN categories_products cat3 ON products.id = 
cat3.product_id 
WHERE (cat1.category_id = 1) and (cat3.category_id = 2) and (cat3.category_id = 3) 

爲每個類別添加一個內部聯接和一個子句。 還有其他疑問可能,這個應該在MySQL中表現良好。