Comments 13
Решение было таким ужасно простым, что даже ввело меня в ступор на некоторое время.

Так написали бы что за решение :)
дык и коммит у вас не один что бы понять где вы смогли прозреть :)
попробуйте отрисовать дерево рекурсией. главная проблема — выбрать на текущем уровне все дочерние узлы для данного parent_id. это операция ресурсоемкая. я просто построил индексный массив, где индекс массива — parent_id. Так для текущей ноды с id=100 я из индексного массива могу выбрать всех дочек просто обратившись children_nodes[100]. выбираю детей пачками и очень быстро. очень простое решение доступное школьнику 9 класса. Просто надо было правильно поставить вопрос, который я себе почему то очень поздно задал.
ссылка выше ведет на строку с конкретным кодом. пояснение написал в комментах. сразу не написал — лишний повод для придирок. На хабре редко дают конструктивные предложения. На мой взгляд, особенности реализации лучше обсуждать в другом месте.
Реквестирую поддержки ancestry!
И спасибо за гем, конечно.
Вообще, конечно, удивляет, что в весьма интегрированном мире RoR нет единого решения для такой базовой вещи, как универсальное дерево.
Присоединяюсь к риквесту. Очень люблю ancestry за возможность легко оперировать его полем на клиенте.
ancestry не входит в круг моих интересов, обещать не буду. Хотя как знать. Возможно кто то решится сам сделать форк и доработать.
Для отрисовки Nested Set дерева достаточно цикла и стека текущих parent-вершин.
полностью согласен. Но ведь за то, что пошел другим путем — не расстреляют?
Дело не в расстреле :-) Дело в том что выгода от использования вложенных множеств — это то что можно выбирать произвольное поддерево одним SQL-запросом. И получив его отсортированным по LEFT несложно его отобразить. Собственно цикл и стек — это просто оптимизации рекурсии, более императивно.
да, все как вы говорите. Но вот что получается — я видел код «плоской» пробежки по дереву. Без рекурсий как у меня. И я не могу вам сказать, что тот код мне было легко понять и кастомизировать. Возможно вы знаете решение лучше, и это конечно же прекрасно, если вы покажете другой удобный путь. Мне тяжело давать оценки без конкретного кода. Если вам не трудно — напишите мне в скайп (он есть на гитхабе). как я понимаю вы сами занимались этим вопросом и у вас есть примеры наработанного кода. Было бы интересно пообщаться на эту тему.
Only those users with full accounts are able to leave comments. Log in, please.