Forum: Ruby on Rails How do you display nested elements in their hierarchy?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Steve N. (Guest)
on 2006-02-01 17:21
Hello;

I'd like some pointers on how to display nested items in their
hierarchy. I'm developing a project that uses habtm (as opposed to "acts
as tree"). I can interact with the elements using "parent", "child" etc.
fine. I just can't figure out how to make the elements *display* in
their relationships.

For example, if Ruby on Rails is a child of Server-Side and a sibling to
PHP, and Server-side is a child of Coding and a sibling to Application,
and Coding is a child of Main, how do I get the contents of the database
to display in a browser something like:
Main
   Coding
      Server-Side
          Ruby on Rails
          PHP
      Application

If I sort the database by parent_id, I get stuff grouped by parent_id,
not organized in the hierarchy. In some other scripting environment I
would probably write some recursive routine but don't know how to
approach it with Rails.

Any tips or pointers would be appreciated. Even what terms to use in
google - I'm getting bird-related sites when I search for "nested"!

Thanks
Ezra Z. (Guest)
on 2006-02-01 19:55
(Received via mailing list)
Steve-

	Here is a helper method I use with acts_as_tree to display a set of
nested <ul>'s. If you have the parent and children methods working
then this should work for you as well. Make sure to set up a counter
cache for your model that you use this on, otherwise you will end up
calling tons of COUNT sql queries as you recurse  through the children.

module ApplicationHelper
   def find_all_children(parent)
     if parent.children.size > 0
       ret = '<ul>'
       parent.children.each { |child|
         if child.children.size > 0
           ret += '<li>'
           ret += link_to "#{child.role}: #{child.last_name}, #
{child.first_name} : #{child.login}",
                          :controller => 'review', :action =>
'boss_view', :id => child
           ret += find_all_children(child)
           ret += '</li>'
         else
           ret += '<li>'
           ret += link_to "#{child.role}: #{child.last_name}, #
{child.first_name} : #{child.login}",
                          :controller => 'review', :action =>
'boss_view', :id => child
           ret += '</li>'
         end
         }
       ret += '</ul>'
     end
   end
end


This will build and return a nested list just like you want. Make
whatever changes to the model names and attributes you need.

Cheers-
-Ezra


On Feb 1, 2006, at 7:21 AM, Steve Nelson wrote:

> For example, if Ruby on Rails is a child of Server-Side and a
>           PHP
> Thanks
>
> --
>
> _______________________________________________
> Rails mailing list
> removed_email_address@domain.invalid
> http://lists.rubyonrails.org/mailman/listinfo/rails
>

-Ezra Z.
WebMaster
Yakima Herald-Republic Newspaper
removed_email_address@domain.invalid
509-577-7732
Steve N. (Guest)
on 2006-02-01 21:57
Ezra
Thank you very much for that. I appreciate your example of a recursive
method in Rails.

I'll see if I can get it to work. Thanks again!
This topic is locked and can not be replied to.