Действует или может действует Act_as_tree для поддержки активной загрузки? - PullRequest
1 голос
/ 01 октября 2009

С помощью act_as_tree я хотел бы иметь возможность предварительно загрузить целое дерево с полной дочерней иерархией без изменений одним вызовом SQL. Для этого я добавил tree_id в таблицу, и она проходит через всех потомков в этом дереве.

Я исследовал act_as_nested_set (на самом деле awesome_nested_set) как возможность, но, поскольку я прививаю деревья к другим деревьям, я обнаружил, что использование вложенного набора для моих целей приводит к слишком большому количеству обновлений. Наряду с acts_as_versioned это неприемлемое усложнение дизайна, который мне нужен. Я считаю, что для моих целей лучше подходит activ_as_tree.

Моя единственная проблема - собрать целое дерево с неповрежденной иерархией. Опция: include ActiveRecord работает с: children, но не с: потомками. Я доволен написанием собственного метода для извлечения и сопоставления ассоциаций вручную. Любое руководство или примеры, как это сделать?

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

Решение, которое я надеюсь избежать, состоит в том, чтобы устранить ассоциацию: children, которая идет вместе с деревом, и определить и вручную загрузить массив children, определенный на каждом узле дерева.

Ответы [ 2 ]

1 голос
/ 01 октября 2009

Я изучал это в прошлом, и IIRC обнаружил, что вы можете загрузить дерево известной глубины одним SQL-запросом, присоединив таблицу к себе n раз; однако невозможно загрузить полное дерево произвольного размера. Отсюда необходимость в вложенном множестве.

Если ваш набор данных относительно мал, вы можете извлечь все записи и собрать деревья в памяти. Возможно, этого будет достаточно?

0 голосов
/ 27 марта 2015

Вы можете index_tree Gem, он обеспечивает энергичные методы загрузки для деревьев

 RootModel.find(1).preload_tree

Подробное описание в этом блоге

...