使用Rails查找结构树中没有子节点的节点

时间:2010-10-22 19:09:32

标签: sql ruby-on-rails activerecord

我有一个类似于树的结构:

class Node < ActiveRecord::Base
   belongs_to :parent,   :class_name => self.to_s, :foreign_key => 'parent_id'
   has_many   :children, :class_name => self.to_s, :foreign_key => 'parent_id', :dependent => :destroy
   ...
end

我可以加载没有此范围的父节点的所有节点:

named_scope :not_child, :conditions => 'parent_id IS NULL'

但是我还需要找到没有子节点但可以拥有父节点的节点,并且我很难用它。我想我必须包括children_events但是我迷路了,我不能使用:

named_scope, :faulty_not_parent, :include => :children, :conditions => "node.parent_id IS NULL"

3 个答案:

答案 0 :(得分:3)

知道了:

named_scope :not_parent, :conditions => "id NOT IN (SELECT DISTINCT parent_id FROM nodes WHERE parent_id IS NOT NULL)"

答案 1 :(得分:1)

我强烈建议您使用插件。有一些acts_as_treeawesome_nested_set和我的个人推荐ancestry,它只使用一列来映射结构,而不是嵌套集结构中的三列。

答案 2 :(得分:0)

我不是SQL大师,所以我无法在纯SQL中找到一个好方法。当然,这意味着我无法找到使用named_scopes的方法。但你可以找到父母,并从所有节点中减去它,如下所示:

def childless
 @childless ||= self.all - self.all(:joins => :children)
end

这并不像我想的那么优雅,因为它需要在内存中加载很多。但它只需要2个选择语句,这很好。我有兴趣看到其他答案。