如果声明,你如何递归?

时间:2014-05-02 21:50:54

标签: ruby-on-rails ruby recursion

我试图与父母建立一个类别系统。以下是我的数据库的结构 - id
- 姓名
- parent_id

基本上我想要它做的是检查是否有父ID,如果是,则检查父ID,以及父母是否有父ID,依此类推。然后按顺序输出父母,直到它到达孩子。

目前我在做什么(在Ruby / Ruby on Rails中)是这样的:

<% @cat = Category.find_by_id(@project.category) %>
<% if @cat.parent_id.nil? %>
    <%= @cat %>
<% else %>
  <%= Category.find_by_id(@cat.parent_id).name%> => <%= @cat.name %>
<% end %>

这个问题是它只获得一个父母。我需要它来递归并不断收集父母直到它结束,并且我也不希望它占用太多的记忆。任何帮助,将不胜感激。谢谢! :)

1 个答案:

答案 0 :(得分:2)

在模型上添加方法以搜索父

class Category
  # inline, less memory usage 
  def last_parent
    last = self
    while last.parent
      last = last.parent  
    end
    last
  end

  # recursive, better readability
  def last_parent_recursive
    if parent
      parent.last_parent_recursive
    else
      self
    end
  end
end

然后,在你的观点上:

<%= @cat.last_parent %>