Rails:没有进入has_many的地方

时间:2014-09-23 18:29:23

标签: sql ruby-on-rails ruby-on-rails-4 arel

我有以下型号

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))
      )

请告诉我有更好的方法!

1 个答案:

答案 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)