У меня есть простая модель с именем Node
и полем с именем parent_id
.Основная идея заключается в том, что корень Node
имеет parent_id == nil
, а затем другие Nodes
используют parent_id
для ссылки на своего родителя Node
.Затем я хочу выполнить обход узлов (сначала в глубину) следующим образом:
def traverse(node)
node.children.each do |child_node|
traverse(child_node)
end
end
Единственное, чего я хочу избежать, - это сделать несколько обращений к базе данных, чтобы получить мои модели.Можно ли получить такую иерархию в одном запросе?Если да, то как?
Я знаю, что могу сделать это с помощью запроса, подобного Node.all
, а затем создать код, который строит всю иерархию, но я полагаю, что это не лучшая практика.Я бы предпочел использовать что-то вроде Node.where(parent_id: nil).includes(children)
, чтобы получить только рут вместе со ссылками, но я не уверен насчет синтаксиса.