我有Recipe
,Ingredient
和RecipeIngredient
。
class Recipe
has_many :recipe_ingredients
has_many :ingredients, through: :recipe_ingredients
end
我的RecipeIngredient
还有其他属性,例如amount
,unit
,type
等。
如果我想从recipe.ingredients
检索这些额外的属性,我将如何以理想情况下不引入N + 1查询或其他任何降低性能的方式进行此操作?
答案 0 :(得分:1)
未经测试但你可以回复我
你的问题有点模糊,但我认为这就是你要找的东西:
recipe = Recipe.includes(:ingredients).find(1)
当然,您可以将find(1)
替换为all
或您想要使用的任何方法。
然后当您从配方的某个成分中选择一个属性时,它将不会生成另一个查询,因为它已经获取了它。
参考:
答案 1 :(得分:0)
ingredients = recipe.ingredients.all
recipe_ingredients = recipe.recipe_ingredients.all
# only two queries. no queries beyond this point
ingredients.each do |ingredient|
recipe_ingredient = recipe_ingredients.find {|it| it.ingredient_id == ingredient.id }
recipe_ingredient.amount # etc
end
也许是这样的东西?