Activerecord:按祖父母值查找记录
Activerecord: find record by grandparent value
我有以下型号:
class GrandParent < ActiveRecord::Base
has_many :parents
has_many :children, through: :parents
end
class Parent < ActiveRecord::Base
has_many :children
belongs_to :grand_parent
end
class Child < ActiveRecord::Base
belongs_to :parent
end
我想找到所有 Children,其中 child 的 grand_parent 的值等于 TRUE,但我无法正确使用语法。类似于:
Child.where(grand_parent.value: TRUE)
您需要加入模型 in-between 才能引用 GrandParent
,因此您必须先加入 Parent
,然后再过滤。
Child.joins(parent: [:grand_parent]).where('grand_parents.value is TRUE')
只是为了验证一下,值是 grand_parents
table 上的实际列还是您只想获取所有与 grand_parents
关联的 children
?
如果是...
Child.joins(parent: [:grand_parent])
应该有效
如果你想获得所有 children 而没有关联 grand_parent
objects 你可以
Child.joins(:parent).where('not exists(select 1 from grand_parents where grand_parents.id = parents.grand_parent_id')
如果中间有一个连接 table 就像 grand_parent_parents
table
会略有不同
Child.joins(:parent).where('not exists(select 1 from grand_parent_parents where grand_parent_parents.parent_id = parent.id')
我有以下型号:
class GrandParent < ActiveRecord::Base
has_many :parents
has_many :children, through: :parents
end
class Parent < ActiveRecord::Base
has_many :children
belongs_to :grand_parent
end
class Child < ActiveRecord::Base
belongs_to :parent
end
我想找到所有 Children,其中 child 的 grand_parent 的值等于 TRUE,但我无法正确使用语法。类似于:
Child.where(grand_parent.value: TRUE)
您需要加入模型 in-between 才能引用 GrandParent
,因此您必须先加入 Parent
,然后再过滤。
Child.joins(parent: [:grand_parent]).where('grand_parents.value is TRUE')
只是为了验证一下,值是 grand_parents
table 上的实际列还是您只想获取所有与 grand_parents
关联的 children
?
如果是...
Child.joins(parent: [:grand_parent])
应该有效
如果你想获得所有 children 而没有关联 grand_parent
objects 你可以
Child.joins(:parent).where('not exists(select 1 from grand_parents where grand_parents.id = parents.grand_parent_id')
如果中间有一个连接 table 就像 grand_parent_parents
table
Child.joins(:parent).where('not exists(select 1 from grand_parent_parents where grand_parent_parents.parent_id = parent.id')