попробуйте отрисовать дерево рекурсией. главная проблема — выбрать на текущем уровне все дочерние узлы для данного parent_id. это операция ресурсоемкая. я просто построил индексный массив, где индекс массива — parent_id. Так для текущей ноды с id=100 я из индексного массива могу выбрать всех дочек просто обратившись children_nodes[100]. выбираю детей пачками и очень быстро. очень простое решение доступное школьнику 9 класса. Просто надо было правильно поставить вопрос, который я себе почему то очень поздно задал.
ссылка выше ведет на строку с конкретным кодом. пояснение написал в комментах. сразу не написал — лишний повод для придирок. На хабре редко дают конструктивные предложения. На мой взгляд, особенности реализации лучше обсуждать в другом месте.
Реквестирую поддержки ancestry!
И спасибо за гем, конечно.
Вообще, конечно, удивляет, что в весьма интегрированном мире RoR нет единого решения для такой базовой вещи, как универсальное дерево.
Дело не в расстреле :-) Дело в том что выгода от использования вложенных множеств — это то что можно выбирать произвольное поддерево одним SQL-запросом. И получив его отсортированным по LEFT несложно его отобразить. Собственно цикл и стек — это просто оптимизации рекурсии, более императивно.
да, все как вы говорите. Но вот что получается — я видел код «плоской» пробежки по дереву. Без рекурсий как у меня. И я не могу вам сказать, что тот код мне было легко понять и кастомизировать. Возможно вы знаете решение лучше, и это конечно же прекрасно, если вы покажете другой удобный путь. Мне тяжело давать оценки без конкретного кода. Если вам не трудно — напишите мне в скайп (он есть на гитхабе). как я понимаю вы сами занимались этим вопросом и у вас есть примеры наработанного кода. Было бы интересно пообщаться на эту тему.
Релиз гема TheSortableTree 2.0