Ruby on rails 使用includes方法关联3个表的模型关联
我有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 <
关联链接在一起
主要表格为配方
,成分
,以及过敏原
。
配方也通过配方成分
链接到成分
,成分
通过成分
链接到过敏原
。
总共有5张桌子
我想做的是看看过敏原
arecipe
有什么
我阅读了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@Tanpomap
生成一个数组,其中每个成分含有过敏原,然后就是展平
,这样它现在是一个含有过敏原的普通数组,但可能含有重复的过敏原,然后被移除。这些都是标准的ruby方法,这里唯一的魔法是preload
,它可以让所有这些运行得更快(没有它仍然可以工作,但是可以分别从DB查询每种成分的过敏原)太棒了!非常感谢你的解释。我对Ruby很陌生。我不知道可以使用展平来消除阵列中的阵列。这很酷,但我不太明白它是怎么工作的。你能再解释一下吗?thanks@Tanpomap
生成一个数组,其中每个成分含有过敏原,然后就是展平
,这样它现在是一个含有过敏原的普通数组,但可能含有重复的过敏原,然后被移除。这些都是标准的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