如何与至少一个孩子关系的孩子打电话给父母?

时间:2014-05-06 12:57:05

标签: ruby-on-rails postgresql relational-database pg

我有一个父对象,它有一个子对象,可以有很多孙对象。

我正在寻找一个优雅的范围,因为它可以与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

这可能吗?

2 个答案:

答案 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