webForumDet fria alternativet

Relationer

Webbutveckling

2 svar · 297 visningar · startad av pirajan

Medlem sedan apr. 2001246 inlägg
Frågan#1

Går rakt på sak;

Jag har två tabeller. categories och subcategories

categories:

id int
name varchar(45)

subcategories:

id int
name varchar(45)
parent_id int

Hur gör jag för att enklast visa dem hierarkiskt i en <ul>-lista enligt:

<ul>
  <li>Kategori1</li>
  <ul>
     <li>Underkategori till 1</li>
  </ul>
  <li>Kategori 2</li>
... osv

Har angett i subcategory-modellen att belongs_to:category, men vet inte riktigt hur jag går till väga efter det.

Tacksam för hjälp.

Medlem sedan dec. 200471 inlägg
#2

Lägg till has_many :subcategories i din category-modell.
Sen i dina controllers måste du givetvis populera vissa instansvariabler med data från modellerna.

I viewen något i stil med:

<ul>
<% @categories.each do  |category| %>
<li><%= category.name %></li>
<% if (category.subcategories.length > 0) %>
<ul>
<% category.subcategories.each do |subcategory| %>
<li><%= subcategory.name %></li>
<% end %>
</ul>
<% end %>
<% end %>
</ul>

Jag är själv nybörjare på rails så förlita dig inte allt för mycket på ovanstående kod.

Ett annat sätt att lösa kategori/underkategori-biten är att köra det i samma tabell och köra acts_as_tree på din kategorimodell.

Medlem sedan apr. 2001246 inlägg
#3

i viewen:

<%= display_tree_recursive(@tree, 0) { |node| node.name } %>

andra parametern (0) anger vilket id "root"-kategorin har.

i helpern:

def display_tree_recursive(tree, parent_id)
    ret = "\n<ul>"
    tree.each do |node|
      if node.parent_id == parent_id
        ret += "\n\t<li>"
        ret += yield link_to node.name, node
        ret += display_tree_recursive(tree, node.id) { |n| yield n } unless node.children.empty?
        ret += "\t</li>\n"
      end
    end
    ret += "</ul>\n"
  end

i controllern:

@tree = Topic.find(:all, :include => [ :children ])

i modellen:

acts_as_tree :parent_id
248 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
116 ms — deklarationer (db)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)
117 ms — ändringar (db)