Jak zamienić drzewo w tablicę hashy

21 Jan 2010 | Adam Przymusiała

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!

Czytaj dalej: