has_many中连接表的额外属性

时间:2014-12-13 00:17:21

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

我有RecipeIngredientRecipeIngredient

class Recipe
  has_many :recipe_ingredients
  has_many :ingredients, through: :recipe_ingredients
end

我的RecipeIngredient还有其他属性,例如amountunittype等。

如果我想从recipe.ingredients检索这些额外的属性,我将如何以理想情况下不引入N + 1查询或其他任何降低性能的方式进行此操作?

2 个答案:

答案 0 :(得分:1)

未经测试但你可以回复我

你的问题有点模糊,但我认为这就是你要找的东西:

recipe = Recipe.includes(:ingredients).find(1)

当然,您可以将find(1)替换为all或您想要使用的任何方法。

然后当您从配方的某个成分中选择一个属性时,它将不会生成另一个查询,因为它已经获取了它。

参考:

http://apidock.com/rails/ActiveRecord/QueryMethods/includes

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

也许是这样的东西?