Rails ActiveRecord - 按曾孙属性查询
Rails ActiveRecord - query by great-grandchild's attribute
如何通过以下设置的 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
/[=19 会发生什么=]/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' })
根据需要将 joins
替换为 includes
或类似内容。
多态性可能会使情况变得更加复杂,但很难说从您提供的少量信息来看是如何造成的。
如何通过以下设置的 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
/[=19 会发生什么=]/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' })
根据需要将 joins
替换为 includes
或类似内容。
多态性可能会使情况变得更加复杂,但很难说从您提供的少量信息来看是如何造成的。