2014-09-23 90 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)