Ruby on rails Rails ActiveRecord-按曾孙查询';s属性

Ruby on rails Rails ActiveRecord-按曾孙查询';s属性,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,如何通过其曾孙属性查找以下设置的父项: 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: {

如何通过其
曾孙
属性查找以下设置的
父项

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\u load
includes
,以及如果
Child
/
孙子
/是多态模型,会发生什么情况?

首先,您需要加入所需的表,告诉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' })
根据需要,将
连接
替换为
包含
或类似内容


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

非常感谢您提供的信息!谢谢,它确实有用!您知道在类似于
granner.preload(children::parents)的地方(child:{parent\u id:1})
应该使用什么语法吗?在我的例子中,
Child
模型是多态的,因为当另一个模型被称为say
Bar
时,一个模型实际上被称为
Child
,如果我没记错的话,不支持立即加入多态关联。您必须为每个类创建单独的关联,或者编写原始sql。多态性不是一个灵丹妙药,虽然使某些事情变得更容易,但也会使其他事情变得更复杂。非常感谢,它确实会引起一些头痛!