0

私の無知を許してください、私はRubyは初めてですが、プログラミングはしていません。アプリケーションに階層データを格納するために Ancestry という gem を使用しています。ノード内のすべての子孫の子、孫などのネストされたハッシュを返す「子孫」と呼ばれるメソッドがありますが、各ノードをループしてすべての子ノードを出力しようとすると苦労しています。

データ構造はこんな感じ

{
  #<Forum id: 16, name: "Parent 1", ancestry: "7", display_order: 1> =>{}, 
  #<Forum id: 17, name: "Parent 2", ancestry: "7", display_order: 2> =>{}, 
  #<Forum id: 13, name: "Parent 3", ancestry: "7", display_order: 3> =>
  {
    #<Forum id: 14, name: "Child 1", ancestry: "7/13", display_order: 1> =>{}, 
    #<Forum id: 15, name: "Child 2", ancestry: "7/13", display_order: 2> =>
    {
      #<Forum id: 18, name: "Grand Child", ancestry: "7/13/15", display_order: 1> =>{}, 
    }
  }
}

以下のコードを使用してそのデータをループすると、最終的に画面にレンダリングされるのは親ノードだけです。

<% forum.descendants.arrange(:order => :display_order).map do |forum,key| %>
  <%= render :partial => 'forum', :locals => {:forum => forum} %>
<% end %>

子ノードもレンダリングするにはどうすればよいですか? 「キー」変数を介してアクセスできることは知っていますが、「キー」変数にレンダリング可能なデータがいつ含まれているか、およびそのデータを出力する方法を知る方法がわかりません。助言がありますか?

4

1 に答える 1

1

を実行して、キーがハッシュかどうかを確認できますkey.is_a?(Hash)

あなたの例で{}は、空のハッシュであるため、常に true と評価されます。ハッシュが空かどうかを確認するには、key.empty?

ネストされたハッシュを反復するには、次のように再帰的に行うことができます

def display hash
    hash.each do |key, val|
        # print key etc
        if val.is_a?(Hash)
            display val
        else
            # print value or whatever operation you want
        end
    end
end
于 2012-08-09T08:00:53.987 に答える