Rails ActiveRecord - 按曾孙属性查询



如何通过以下设置的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"}
}
}
)

当我使用joinpreloadeager_loadincludes时,我该如何操作?如果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

多态性可能会使情况变得更加复杂,但从你提供的少量信息来看,很难说是怎么回事。

最新更新