Cześć,
Dzisiaj następujące pytanie: w jaki sposób ułatwić sobie wyświetlanie drzewa ( model typu acts_as_tree ) - normalnie działa to tak, że mamy funkcje rekurencyjną która przechodzi przez wszystkie gałązki i je wyświetla.
Ale jestem pewien że w Railsach jest to rozwiązane dużo lepiej, niestety nie wiem jeszcze jak, wiec prosze was o wskazówki
powiedzmy że mam akcje list i szablon widoku list.rhtml i chce aby drzewo wyświetlało sie prymitywnej formie typu:
[/code]
Rozwiązanie teoretyczne :D nie testowałem. Dla każdego elementu items wyświetli sie szablon, który w przypadku posiadania dzieci będzie wywoływał sie rekurencyjne (wydajność?)
Pozdrawiam
ps. sorki za te znaczniki html, ale JAK je wstawić w code, by nie zostały wycięte?
ps2. code=html
def list
@categories = Category.find( :all, :conditions => [ "parent_id = 0"] );
end
Żeby znalazł nam tylko korzenie.
Dodatkowo mam pytanie: nie wiem jak zapisac w ruby warunek, żeby wybrać wiersze z polem parent_id = NULL, ani :conditions => [ “parent_id = NULL”] ani :conditions => [ “parent_id = ?”, nil] nie dziala ? dlatego zamienilem NULL na 0 w tym wypadku.
[quote=hosiawak]:conditions => ‘parent_id IS NULL’
albo tak:
:conditions => ['parent_id IS ?, nil]
Pierwszy sposób lepszy bo krótszy :)[/quote]
Drugi sposób wspaniale nadaje się do wykorzystania w sytuacji gdzie nil jest wartością parametru. Jest to bardziej czytelny. Choć oczywiście nie w tym konkretnym przypadku, bo tu, jeśli dobrze rozumiem, param permanentnie równa się nil.
param = nil
:conditions => ['parent_id IS ?, param]
większość algorytmów do przechodzenia grafów to alg. rekurencyjnie, stosuje się inne rozwiązania do naprawdę zaawansowanych przypadków, ale i tam wykorzystuje się rekurencje…
dla
categories_helper.rb
[code=ruby]module CategoriesHelper
def make_tree(family)
if family.parent_id.nil?
str = ‘
’
str += ‘
’ + family.name + ‘
’
str += find_child(family)
str += ‘
’
end
str
end
def find_child(parent)
str = ‘
’
if parent.has_children?
parent.children.map do |child|
if child.has_children?
str += ‘
Odgrzebuję stary temat bo mam problem z implementacją. Zrobiłem wszystko z waszymi wskazówkami, wszystko jest funkcja list wyświetla mi drzewo kategorii. Lecz teraz mam problem, jak należy wywołać z poziomu layoutu tą funkcję list żeby kategorie były wyświetlane przy jego użyciu?
Probowałem poprzez
<%= render :partial => “list” %>
lecz otrzymuję błąd o pustym obiekcie. Jak to najlepiej ominąć? Wiem że da się to zrobić poprzez zmianę <%= render( :partial => ‘list_item’, :collection => @categories ) %> na <%= render( :partial => ‘list_item’, :collection =>Category.find_all_by_parent_id(nil) ) %> ale nie jest to chyba poprawne z punktu widzenia programistycznego. Jak to powinno się wykonać najlepiej?