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"}
    }
  }
)

以及我何时使用 joinpreloadeager_loadincludes,如果 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 或类似内容。

多态性可能会使情况变得更加复杂,但很难说从您提供的少量信息来看是如何造成的。