2014-09-23 94 views
1

我有以下型号Rails的:其中不上的has_many通过

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 JOINincludes确实会处理这个问题。

你应该怎么写这个查询?

编辑:

我得到这个工作有以下,但它似乎真的总值:

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

我会做这种方式:

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)