HBTM关系的AR 3范围用于检索与所有ID匹配的元素

时间:2011-06-29 14:48:13

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

好的,标题不太好......

以下是示例:

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。 我希望产品至少包含我发送的所有类别作为参数。

例如:

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).

2 个答案:

答案 0 :(得分: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中表现良好。

答案 1 :(得分:1)

谢谢@tal!

以下是我在纯scopable AR中实现您的解决方案: https://gist.github.com/1071862

:)