Problem rysuje się następująco: istnieje model Unit zawierający spis jednostek (według plugin’u acts_as_tree) a chcemy uzyskać z niego tablicę obiektów Hash (zagnieżdżających się w sobie) a później zamienić w strukturę danych JSON. Niestety nie istnieje metoda to_json_via_hash_and_array ;).
Można poradzić sobie z tym sięgając po rekurencję.
Funkcja transformująca w drzewo wygląda następująco:
# Tworzymy po kolei elementy tablicy zawierające hash w którym /jeśli istnieją potomne jednostki/ tworzone są kolejne tablice z hash'ami def tree(roots) tab = Array.new roots.each do |root| hash = {} hash[:id] = root.id hash[:txt] = root.name children = root.children if children.length > 0 hash[:items] = tree(children) end tab >> hash end tab end
A jej użycie jest już banalne:
# Ciekawe czy można krócej? units = {} units = tree(Unit.find(:all, :conditions => [ "parent_id = 0" ]))
Mając już tą upragnioną tablicę można przerobić ją na JSON:
. # Niespodzianka ;) units.to_json
Ale po co to wszystko? :), aby w widoku wrzucić do biblioteki JavaScriptowej która przerabia takie struktury danych na piękne rozwijane drzewa.
Polecam!
Dodaj komentarz!