0

我正在为 Rails 3.1.1 中的 ActiveRecord 查询而苦苦挣扎。

我有 2 个模型,产品和类别,从产品到类别有一个 has_and_belongs_to_many(一个产品可以有很多类别)。

我正在尝试编写一个搜索查询,该查询将找到具有所有指定类别的产品(想想用户可以选择 X 类别进行搜索的搜索 UI)。

我可以做这个:

results = Product.joins(:category_products).where('category_products.category_id' => [1,5,8])

但这会返回具有任何这些类别的产品(即生成 SQL“IN(1,5,8)”子句)。

如何创建一个可以进行 ALL 匹配的查询?例如,查找具有所有这些 category_id 的产品...

4

2 回答 2

4

您可以使用 having 子句来做到这一点:

@ids = [1,5,8]
query = Product.select('products.id,products.name').joins(:categories) \
               .where(:categories => {:id => @ids}) \
               .group('products.id, products.name') \
               .having("count(category_products.category_id) = #{@ids.length}")
于 2012-08-09T16:00:17.583 回答
0
results = Product.joins(:category_products)
[1,5,8].each do |category|
  results = results.where('category_products.category_id' => category)
end
于 2012-08-09T14:51:11.727 回答