获取所有后代类别的Rails方法

Fra*_*ank 2 ruby ruby-on-rails

以前,我在rails应用程序中显示了一个简洁而优秀的方法来获取给定类别的所有祖先类别:

def ancestors
  result = []
  c = self
  while c.parent
    result.unshift(c.parent)
    c = c.parent
  end
  result
end   
Run Code Online (Sandbox Code Playgroud)

现在我想弄清楚如何获得给定类别(孩子,孩子的孩子等)的所有后代类别.我能得到的最接近的是以下,但我仍然有问题最终的结果数组搞砸了.顶级数组未关闭.我已经打了好几个小时,我不知道如何解决它.

def descendants

  result = []
  c = self

  for child in c.children
   result.push(child)
   if(child.children.any?)
    result.push(child.descendants)
   end
  end

  result

end
Run Code Online (Sandbox Code Playgroud)

Har*_*tty 5

试试这个:

def descendants
  children.map(&:descendants).flatten
end

def ancestors
  [parent, parent.try(:ancestors)].compact.flatten
end
Run Code Online (Sandbox Code Playgroud)

手动树遍历具有性能影响.您应该考虑使用像祖先一样的宝石,它可以很好地完成树形表示.

编辑1

如果您正在使用awesome_nested_setgem,请注意它在AR实例上有ancestorsdescendants方法.您可以使用ruby对这些方法的结果进行排序(如果您处理的是小集<100).

category.descendants.sort_by(&:name)
Run Code Online (Sandbox Code Playgroud)