18764


以下のコードのようなテーブルを作ろうとしております。  
(親のIDとアイテム名を表示させるテーブル)

その実装にいわゆる入れ子モデル？の方式で実装を進めております。

アイテム  
-サブアイテム  
\--サブアイテム  
\---サブアイテム

という風に階層を深くしていくテーブルを実装中で、コードは以下になります。  
以下のコードで深い階層のサブアイテムも表示させようとすると、childrenのループの中に、さらにループをたして、その中にさらにループを・・・とやっていくと、できなくはないですが、もう少し上手な方法ができないかと考えております。

while文で試して見たのですが、無限ループにかかってしまい、上手く出来ませんでした。

どなたかやり方が分かる方はいらっしゃいますでしょうか？  
宜しくお願いします。

※item.childrenでのchildrenはアイテムのprent_idを見て、該当するサブアイテムを複数返します。

[code]

    tbody
      -@items.each do |item|
        tr
          td #{item.parent_id}
          td #{item.name}
          td
            tbody
              -item.children.each do |child_item|
                tr
                  td #{child_item.parent_id}
                  td #{child_item.name}
    
[/code]


CC BY-SA 3.0
2015-11-12T13:35:25.840
18744
2015-11-13T00:59:09.257
13175
question
ruby-on-rails ruby
入れ子モデルで無限ループをさけながら、深い階層まで表示させるテーブルを作りたい（一部コードあり）


似たようなサンプルアプリを作ってみました。  
partial viewを使えばうまくいくと思います。

## 出力結果

[![画像の説明をここに入力](https://i.stack.imgur.com/OQXLC.png)](https://i.stack.imgur.com/OQXLC.png)

## Model

[code]

    class Group < ActiveRecord::Base
      belongs_to :parent_group, class_name: 'Group', foreign_key: 'parent_group_id'
      has_many :children, class_name: 'Group', foreign_key: 'parent_group_id'
    end
    
[/code]

## seeds.rb

[code]

    Group.destroy_all
    
    parent_1 = Group.create!(name: '親1')
    parent_2 = Group.create!(name: '親2')
    
    child_1_1 = parent_1.children.create!(name: '子1-1')
    child_1_2 = parent_1.children.create!(name: '子1-2')
    
    child_2_1 = parent_2.children.create!(name: '子2-1')
    
    grand_child_1_1_1 = child_1_1.children.create!(name: '孫1-1-1')
    
[/code]

## Controller

[code]

    def index
      @groups = Group.where(parent_group_id: nil)
    end
    
[/code]

## index.html.erb

[code]

    <h1>Listing Groups</h1>
    
    <%= render 'groups', groups: @groups %>
    
[/code]

## _groups.html.erb

[code]

    <dl>
      <% groups.each do |group| %>
        <dt><%= group.name %></dt>
        <dd>
          <% if children = group.children.presence %>
            <%= render 'groups', groups: group.children %>
          <% else %>
            子グループがありません。
          <% end %>
        </dd>
      <% end %>
    </dl>
    
[/code]

## HTML

[code]

    <dl>
      <dt>親1</dt>
      <dd>
        <dl>
          <dt>子1-1</dt>
          <dd>
            <dl>
              <dt>孫1-1-1</dt>
              <dd>子グループがありません。 </dd>
            </dl>
          </dd>
          <dt>子1-2</dt>
          <dd>子グループがありません。 </dd>
        </dl>
      </dd>
      <dt>親2</dt>
      <dd>
        <dl>
          <dt>子2-1</dt>
          <dd>子グループがありません。 </dd>
        </dl>
      </dd>
    </dl>
    
[/code]


CC BY-SA 3.0
2015-11-13T00:59:09.257
18764
2015-11-13T00:59:09.257
85
18744
answer