Рекурсивно загружать все дочерние / родительские записи в иерархию - PullRequest
1 голос
/ 27 сентября 2011

- Rails: 2.3.8, Ruby: 1.9.2v180, MySQL: 5.1.56 -

У меня есть рекурсивная модель с именем ExternalCategory, которая

  belongs_to :parent, :class_name => "ExternalCategory", :foreign_key => "parent_id"

и

  has_many :children, :class_name => "ExternalCategory", :foreign_key => "parent_id"

Я отображаю эту иерархию в разбивке по страницам, где изначально отображается только некоторое количество категорий верхнего уровня.Все предки этих категорий верхнего уровня загружаются на страницу, но отображаются только через js.

Внешняя категория может иметь более 1000 предков, поэтому без активной загрузки эти страницы могут занять огромное количество времени для загрузки.Тем не менее, я работаю над добавлением нетерпеливой загрузки соответствующим образом, но я не совсем уверен, что это будет.Возможно, вы можете помочь.

В данный момент у меня есть область видимости для top_level_categories внутри ExternalCategory:

named_scope :top_level_categories, :conditions => "parent_id is null"

, а затем прикреплена к концу строки has_many :children ... вышеЯ добавил это предостережение:

   , :include => :children

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

Основная проблема со всем этимчто я создаю в своей таблице идентификаторы строк, которые ссылаются на идентификатор текущего элемента, а также все идентификаторы его предков.Этот идентификатор используется js при развертывании / сворачивании дочернего представления любой категории.Чтобы создать эти идентификаторы, я обращаюсь к предкам текущей категории с помощью рекурсивных вызовов #parent.В результате я получаю тонну одинаковых строк, которые выглядят так:

CACHE (0,0 мс) SELECT * FROM external_categories WHERE (external_categories. id = 216)

Если я не буду давать строкам все уникальные идентификаторы, это полностью разрушит страницу (очевидно), но вещи начнут загружаться разбитыми ликами.

Любые советы, альтернативные перспективы или что бы вы оценили по достоинствуэтот пункт.

Заранее спасибо!

1 Ответ

0 голосов
/ 27 сентября 2011

Встроенный плагин acts_as_tree не очень хорош в этом, но есть альтернативы, такие как родословная , которые поддерживают root_id для решения этой конкретной проблемы.

Подход, который неДля изменения чего-либо требуется выбор одного «уровня» глубины за следующим, пока у вас не закончатся результаты, и резко сократите время поиска.

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

...