#ruby-on-rails #activerecord #model
#ruby-on-rails #activerecord #Модель
Вопрос:
это мой первый пост в сообществе, и у меня есть проблема: представить дерево категорий.
Первое решение: каждая категория имеет ссылку на свою родительскую категорию. Проблема с этим решением заключается в том, что когда мне нужно поддерево категорий, мне приходится запрашивать базу данных несколько раз, по одному запросу на уровень (высоту) дерева, и я хочу, чтобы какое-то решение было более оптимизированным.
Выбранное решение: Категория (идентификатор, имя, описание) и CategoryxCategory ( ancestor_id, descendant_id
) И поэтому для построения поддерева мне понадобится только один запрос, подобный этому ,
select * from category a, categoryxcategory b.where b.ancestor_id = 1 and
b.descendant_id = a.id , gets all sub-categories of the category with id = 1.
Я выполнил это решение на java, используя hibernate, но я не смог выполнить в Rails, как мне указать это в migration и ActiveRecord?
Большое спасибо
Ответ №1:
Разве вы не можете просто указать столбцы ancestor_id и descendant_id в категории?
вот популярный драгоценный камень, который создает деревья для васhttps://github.com/collectiveidea/awesome_nested_set
Комментарии:
1. На самом деле я не могу, потому что я хочу построить поддерево с помощью одного запроса в БД, выполняя это решение, мне пришлось бы несколько раз запрашивать БД, чтобы получить поддерево высотой> 2. Я попробую этот камень
2. Просто чтобы закончить тему, что действительно помогло мне, так это Ancestry , это делает именно то, что я хотел. Спасибо вам за помощь
Ответ №2:
существует другой шаблон: вложенный набор, который довольно эффективен при чтении, но не при обновлении больших деревьев / вставке / изменении порядка. взгляните на драгоценный камень nested_set здесь. ссылающийся на себя many2many будет по сути графом, что означает, что если вы не будете осторожны, вы можете получить поврежденные деревья (т. Е. Узлы с несколькими родителями).