我有一个父对象,它有一个子对象,可以有很多孙对象。
我正在寻找一个优雅的范围,因为它可以与PG一起派生出一个至少有一个孙子对象的父。
class Parent < ActiveRecord::Base
has_many :childs
# scope :has_grandchildren ...
end
class Child < ActiveRecord::Base
has_many :grandchilds
belongs_to :parent
end
class Grandchild < ActiveRecord::Base
belongs_to :child
end
这可能吗?
答案 0 :(得分:3)
class Parent < ActiveRecord::Base
has_many :childs
has_many :grandchilds, :through => :childs
scope :has_grandchildren, childs.includes(:grandchilds).group("childs.id").having("count(grandchilds.id) < 0")
end
class Child < ActiveRecord::Base
has_many :grandchilds
belongs_to :parent
end
class Grandchild < ActiveRecord::Base
belongs_to :child
end
我添加了has_many through
关系以防您以后需要它,尽管它是可选的。
答案 1 :(得分:1)
我想你只是想这样做。 includes
是外部联接。 joins
是一个内连接,它将排除有0个子节点或0个孙子节点的结果。
class Parent < ActiveRecord::Base
has_many :childs
scope :has_grandchildren, joins(:childs => :grandchilds).uniq
end