我在尝试使用rails / ruby中的递归方法时遇到问题。目的是基于parent_id查找给定类别的所有祖先类别。当前方法确实返回了正确的祖先类别,但它正在嵌套数组。我认为这是因为我正在初始化category_ancestors数组,然后随着方法通过自身进行重新初始化而重新初始化。我正在试图找出如何更改这一点,以便我得到一个具有类别属性的单级数组,而不是现在如何输出数据。
def self.get_ancestors(category)
category_ancestors = [] # <-- this seems to be the problem
category_ancestors << category.attributes
if category.has_parent?
category.get_parent.each do |parent_category|
category_ancestors << get_ancestors(parent_category)
end
end
category_ancestors.reverse
end
返回类似于嵌套数组的东西(但我需要它们在同一级别):
---
- - - name: Category 1
id: 1
created_at: 2011-09-04 22:56:43.198413 Z
updated_at: 2011-09-07 00:14:09.934813 Z
parent:id
- name: Category 2
id: 2
created_at: 2011-09-04 22:56:43.198413 Z
updated_at: 2011-09-07 00:14:09.934813 Z
parent:id: 1
- name: Category 3
id: 3
created_at: 2011-09-04 22:56:43.198413 Z
updated_at: 2011-09-07 00:14:09.934813 Z
parent:id: 2
答案 0 :(得分:1)
这是一个非递归版本,可以做同样的事情
class Category
def ancestors
result = []
c = self
while c.parent
result.unshift(c.parent)
c = c.parent
end
result
end
end
答案 1 :(得分:0)
如果你需要一个平面数组,你应该使用concat()将元素连接到一个数组中,而不是以数组数组结束。
def self.get_ancestors(category)
category_ancestors = [] # <-- this seems to be the problem
category_ancestors << category.attributes
if category.has_parent?
category.get_parent.each do |parent_category|
category_ancestors.concat(get_ancestors(parent_category))
end
end
category_ancestors.reverse
end
答案 2 :(得分:0)
我会用这样的东西:
category_ancestors += get_ancestors(parent_category)