Ruby on rails 使用includes方法关联3个表的模型关联

Ruby on rails 使用includes方法关联3个表的模型关联,ruby-on-rails,ruby-on-rails-5,Ruby On Rails,Ruby On Rails 5,我有3个主表通过关联链接在一起 主要表格为配方,成分,以及过敏原。 配方也通过配方成分链接到成分,成分通过成分链接到过敏原。 总共有5张桌子 我想做的是看看过敏原arecipe有什么 我阅读了rails文档,发现我可以使用includes选项来做类似的事情,但在示例中,表是直接关联的。见下文 class LineItem < ApplicationRecord belongs_to :book, -> { includes :author } end class Book <

我有3个主表通过
关联链接在一起

主要表格为
配方
成分
,以及
过敏原
。 配方也通过
配方成分
链接到
成分
成分
通过
成分
链接到
过敏原

总共有5张桌子

我想做的是看看
过敏原
a
recipe
有什么

我阅读了rails文档,发现我可以使用
includes
选项来做类似的事情,但在示例中,表是直接关联的。见下文

class LineItem < ApplicationRecord
 belongs_to :book, -> { includes :author }
end

class Book < ApplicationRecord
 belongs_to :author
 has_many :line_items
end

class Author < ApplicationRecord
 has_many :books
end
我一直在尝试以多种方式使用
includes
,但都不起作用。有人知道在这种情况下是否可以使用
includes
?理想情况下,我希望能够调用
recipe.allergones
查看与该配方相关的所有过敏原


谢谢大家

包含
用于快速加载

尝试:

recipe.components.preload(:过敏原).map{ing | ing.过敏原.to_a}.flant.uniq

这是简单的“从所有成分中提取所有过敏原,放入一个数组中并去除重复的过敏原”,并且
预加载
是为了避免N+1问题

包含
是为了快速加载

尝试:

recipe.components.preload(:过敏原).map{ing | ing.过敏原.to_a}.flant.uniq

这是很简单的“从所有成分中提取所有过敏原,放入一个数组中,并去除重复的过敏原”,并且
预加载
是为了避免N+1问题

这是有效的,但我不太明白它是如何工作的。你能再解释一下吗?thanks@Tanpo
map
生成一个数组,其中每个成分含有过敏原,然后就是
展平
,这样它现在是一个含有过敏原的普通数组,但可能含有重复的过敏原,然后被移除。这些都是标准的ruby方法,这里唯一的魔法是
preload
,它可以让所有这些运行得更快(没有它仍然可以工作,但是可以分别从DB查询每种成分的过敏原)太棒了!非常感谢你的解释。我对Ruby很陌生。我不知道可以使用展平来消除阵列中的阵列。这很酷,但我不太明白它是怎么工作的。你能再解释一下吗?thanks@Tanpo
map
生成一个数组,其中每个成分含有过敏原,然后就是
展平
,这样它现在是一个含有过敏原的普通数组,但可能含有重复的过敏原,然后被移除。这些都是标准的ruby方法,这里唯一的魔法是
preload
,它可以让所有这些运行得更快(没有它仍然可以工作,但是可以分别从DB查询每种成分的过敏原)太棒了!非常感谢你的解释。我对Ruby很陌生。我不知道可以使用展平来消除阵列中的阵列。很酷。
# recipes:
  has_many :recipe_ingredients
  has_many :ingredients, through: :recipe_ingredients

# recipe_ingredients:
  belongs_to :recipe
  belongs_to :ingredient

# ingredients:
  has_many :recipe_ingredients
  has_many :recipes, through: :recipe_ingredients

# ingredient_allergens:
  belongs_to :ingredient
  belongs_to :allergen

# allergens:
  has_many :ingredient_allergens
  has_many :allergens, through: :ingredient_allergens