Каков наилучший способ визуализации следующего дерева объектов ruby ​​в рельсах 2.3? - PullRequest
1 голос
/ 26 ноября 2010

У меня есть массив (отсортированный по атрибуту, называемому node_id) объектов ruby, который в основном нужно визуализировать на внешнем интерфейсе в виде дерева (ul> li> ul> li ...). Я использую рельсы 2.3.8. Этот объект исходит из БД, структура которого не может быть легко модифицируема.

   [#<Node node_id: 3, children: "10, 42",name: "A", weight: 45, root: true>,
    #<Node node_id: 4, children: "6,88", name: "B", weight: 32, root: true]
    #<Node node_id: 6, children: nil, name: "X", weight: 12, root: false>,
    #<Node node_id: 7, children: "9", name: "P", weight: 98, root: true>,
    #<Node node_id: 9, children: nil, name: "Q", weight: 12, root: false>,
    #<Node node_id: 10, children: "23,56",name: "R", weight: 34, root: false>,
    #<Node node_id: 13, children: nil, name: "T", weight: 75, root: true>,
    #<Node node_id: 23, children: nil, name: "C", weight: 57, root: false>,
    #<Node node_id: 42, children: nil, name: "D", weight: 25, root: false>,
    #<Node node_id: 56, children: nil, name: "Y", weight: 50, root: false>
    #<Node node_id: 88, children: nil, name: "W", weight: 15, root: false>]

Каков наилучший способ производительности и дизайна для визуализации такого дерева в интерфейсе? Это просто примерный набор, дерево не всегда сбалансировано и может иметь сотни узлов.

1 Ответ

2 голосов
/ 26 ноября 2010

Предположим, что вы преобразовали потомков в массив целых чисел со следующим

class Node
  def child_id_array
    case children
    when String: children.scan(/\d+/).map(&:to_i)
    when nil: []
    end
  end
end

Затем мы можем индексировать узлы (для поиска с постоянным временем) следующим образом:

index=Hash.new
nodes.each do |x|
  index[x.node_id] = x
end

Или, если у вас установлен facets драгоценный камень, вы можете просто сказать

index=nodes.group_by(&:node_id)

Давайте найдем корневые узлы (те, которые не являются дочерними для кого-либо еще)

roots = index.keys - nodes.map(&:child_id_array).flatten
roots.uniq!

Теперь мы визуализируем с помощью рекурсивной функции

def render allnodes, nodenumbers
  puts '<ul>'
  nodenumbers.each do |n|
    puts "<li>#{allnodes[n].name}" 
    render allnodes, allnodes[n].child_id_array
    puts "</li>"
  end
  puts '</ul'>
end

Начать дела

render index,roots
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...