rails递归方法问题

时间:2011-09-07 15:22:49

标签: ruby-on-rails ruby

我在尝试使用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

3 个答案:

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