递归迭代嵌套结构

时间:2013-08-28 23:47:12

标签: ruby-on-rails ruby

我在文件系统上嵌套了文件夹对象,如目录结构。用户可以:

  • 文件夹1
  • 文件夹2

    • 文件夹2a
    • 文件夹2b
      • Folder 2ba
      • 文件夹2bb
  • 文件夹3

依此类推,就像用户想要的那样。我试图在视图中显示文件夹结构,如上所示。

我可以在第一级执行each,对于该级别中的每个文件夹,对其子项执行each,然后对其子项each进行操作,依此类推。但这似乎效率低下。我不希望有一个预先设定的水平限制。这似乎应该是自动化的,但我不太确定如何这样做。此外,似乎递归不是一种选择,因为视图中没有方法。

这对帮手有用吗?我应该放弃并仅在单击父文件夹时加载子文件夹,使用javascript?

2 个答案:

答案 0 :(得分:2)

假设您有一个Folder类,并使用subfolders方法,那么您需要一个递归部分,比如_folder.html.erb

<li><%= folder.name %></li>
<% unless folder.subfolders.empty? -%>
  <li>
    <ul>
      <%= render partial: "folder", collection: folder.subfolders %>
    </ul>
  </li>
<% end -%>

然后在ul上设置一些填充,你就应该好了。

对partial的初始调用可能看起来像这样@folders包含您的顶级文件夹,并且会生活在folders.html.erb或类似文件中:

<ul>
  <%= render partial: "folder", collection: @folders %>
</ul>

答案 1 :(得分:0)

可能是这样的:

class Folder < ActiveRecord::Base

  def self.add_in_children(folder)

    folder.children.each do |child|

      @all_folders << [level,child]
      @level+=1
      if child.children
        add_in_children(child)
      end
    end
  end 

  def self.all_records
    @all_folders=[]
    @level=0
    @folders=add_in_children('/')
  end

end

Folder.all_records;