我有以下型号
class Recipe < ActiveRecord::Base
has_many :recipe_allergens
has_many :allergens, through: :recipe_allergens
end
我试图找到所有没有给定过敏原的食谱,所以我尝试了joins(:allergens).where.not(allergens: { id: allergens })
。
不幸的是,这并不考虑空案例,其中Recipe
可能没有任何关联的Allergen
。
我认为LEFT OUTER JOIN
所做的includes
可以解决这个问题。
你应该怎么写这个查询?
修改
我使用了以下内容,但看起来非常严重:
joins("LEFT OUTER JOIN recipe_allergens ON recipe_allergens.recipe_id = recipes.id")
.joins("LEFT OUTER JOIN allergens ON allergens.id = recipe_allergens.allergen_id")
.where(
Allergen.arel_table[:id].not_in(allergen_ids)
.or(Allergen.arel_table[:id].eq(nil))
)
请告诉我有更好的方法!
答案 0 :(得分:0)
我会这样做:
allergenes = Allergene.where #....
allergene_ids = allergenes.pluck(:id)
bad_recipe_ids = RecipeAllergenes.where(allergene_id: allergene_ids)
.pluck(:recipe_id)
recipes = Recipe.where('id NOT IN ?', bad_recipe_ids)