ALL IN,而不是任何,但恰好所有元素都匹配

时间:2015-11-05 15:36:47

标签: ruby-on-rails postgresql rails-activerecord relational-division

class Recipe < ActiveRecord::Base
  has_many :ingredients
end

class Recipe::Ingredient < ActiveRecord::Base
  belongs_to :product
  # also has `require_in_filter` boolean attribute
end

我希望通过产品ID获取所有这些食谱,其中所有这些产品都含有require_in_filter = true的成分。 例如,一个配方有两个成分:都有require_in_filter = true,它们引用的产品ID为2和3。

  • 查询产品配方(2,3)必须返回此配方。
  • 查询产品配方(2,3,17)不得退回此配方。
  • 查询产品配方(2)不得退回此配方。

到目前为止我尝试了什么:

Recipe.joins(:ingredients)
.where('recipe_ingredients.require_in_filter = ? AND recipe_ingredients.product_id IN (?)', true, [3,4])
.distinct

但是此查询返回带有任何产品ID的配方(在这种情况下为3或4)。但我只需要所有这些产品的配方。

我发现了类似问题PostgreSQL where all in array,但没有帮助。

Recipe.joins(:ingredients)
.select('COUNT(*) AS count, recipes.*')
.where('recipe_ingredients.require_in_filter = ? AND recipe_ingredients.product_id IN (?)', true, [3,4])
.group('recipes.id').having('count(*) = ?', 2)

始终返回空数组

这个原始的sql

select recipes.*
from recipes 
join recipe_ingredients
on recipe_ingredients.recipe_id = recipes.id
where not exists(
    select * from recipe_ingredients ri 
    where ri.recipe_id = recipes.id
    and ri.product_id not in(2,3,17)        
)
and recipe_ingredients.require_in_filter = true
group by recipes.id

返回配方2和3作为唯一需要的产品,但它不应该因为17也必须。

我的SQL知识不足以完成此任务

1 个答案:

答案 0 :(得分:0)

您的第二个查询无效,因为您GROUP recipes.id当{ - 1}} - 如果我理解正确 - 您要查询不同{{1}的计数},所以请尝试product_id

GROUP