如何通过以下设置的GreatGrandChild
属性找到Parent
:
Parent has_many :children
Child belongs_to :parent, has_many :grand_children
GrandChild belongs_to :child, has_many :great_grand_children
GreatGrandChild belongs_to :grand_child
Parent.where(
children: {
grand_children: {
great_grand_children: {:name => "foo"}
}
}
)
当我使用join
、preload
、eager_load
或includes
时,我该如何操作?如果Child
/GrandChild
/GreatGrandChild
是多态模型,会发生什么?
首先,您需要加入所需的表,告诉rails要走哪条路径。
Parent.joins(children: { grand_children: :great_grand_children })
如果将这些信息添加到模型中,则可以简化此过程。
Parent.has_many :grand_children, through: :children
Parent.has_many :great_grand_children, through: :grand_children
在那之后,一个单独的加入就足够了,但在后台它会做同样的事情
Parent.joins(:great_grand_children)
现在所有的表都已联接,我们可以添加where条件。Join已经知道表的来源,因此无需再次指定。
Parent.joins(:great_grand_children).where(great_grand_children: { name: 'foo' })
根据需要,用includes
或类似物替换joins
。
多态性可能会使情况变得更加复杂,但从你提供的少量信息来看,很难说是怎么回事。