Алгоритм сортировки модели вложенности / аджентности в Ruby - PullRequest
2 голосов
/ 09 февраля 2010

Я пытался найти хороший способ сделать это, либо на стороне клиента в Javascript, либо в последнюю минуту на сервере. Это приложение на Rails, но это довольно общий вопрос. У меня есть модель, которая является иерархической, и в настоящее время хранится в модели вложенного набора. Модель тогда имеет:

parent_id, lft, and rgt

Я хотел бы вытащить все модели в одном операторе выбора из базы данных, поэтому дал бы мне простой список моделей, а затем отсортировать их на лету в древовидную иерархию. Я не нашел чистого способа сделать это, не требующего рекурсии. Я уверен, что есть хороший алгоритм для этого. Спасибо.

1 Ответ

0 голосов
/ 09 февраля 2010

Я не знаю алгоритма без рекурсии. Думаю, я все равно поделюсь своим помощником по просмотру карты сайта:

def tree_from_set(set, &node_text)
  buf = '<ul>'
  siblings = set.select{|n| n.parent_id == set[0].parent_id}

  siblings.each do |node|
    children = set.select{|n| n.lft > node.lft and n.rgt < node.rgt }
    buf << '<li>'
      if children.blank?
        buf << yield(node)
      else
        buf << yield(node)
        buf << tree_from_set(children, &node_text)
      end
    buf << '</li>'
  end
  buf << '</ul>'
end
...