2011-09-07 89 views
1

我在嘗試獲取遞歸方法以在rails/ruby​​中工作時出現問題。目的是根據parent_id查找給定類別的所有祖先類別。當前方法確實返回了正確的祖先類別,但它嵌套了數組。我認爲這是因爲我正在初始化category_ancestors數組,然後當方法通過自身遞歸時它正在重新初始化。我想弄清楚如何改變這個,以便我得到一個具有類別屬性的單層數組,而不是現在如何輸出數據。rails遞歸方法問題

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 

回答

1

這裏有一個非遞歸版本做同樣的事情

class Category 
    def ancestors 
    result = [] 
    c = self 
    while c.parent 
     result.unshift(c.parent) 
     c = c.parent 
    end 
    result 
    end 
end 
+0

很大的幫助,簡單多了,非常感謝。 – Frank

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 
+0

非常感謝,我現在看到我應該使用concat將事物保存在一個數組中。 – Frank

0

我會用這樣的:

category_ancestors += get_ancestors(parent_category)