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。
到目前为止我尝试了什么:
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知识不足以完成此任务
答案 0 :(得分:0)
您的第二个查询无效,因为您GROUP
recipes.id
当{ - 1}} - 如果我理解正确 - 您要查询不同{{1}的计数},所以请尝试product_id
:
GROUP