Мне нужно рекурсивно найти все дочерние элементы родительского элемента в postgres.
У меня есть такая структура таблицы:
items
-----
id
modifiers
---------
id
item_modifiers
--------------
id
item_id
modifier_id
modifier_items
--------------
id
item_id
modifier_id
Элемент has_many child_modifiers
through item_modifiers
Модификатор has_many child_items
до modifier_items
.
Так что в основном иерархия выглядит так: item -> item_modifiers -> modifier -> modifier_items -> item
У меня есть это, но не работает. Не уверен, что изменить.
WITH RECURSIVE search_tree(id, path) AS (
SELECT "items".id, ARRAY["items".id]
FROM items
WHERE "items".id ='#{top_level_item.id}'
UNION ALL
SELECT #{table_name}.id, path || #{table_name}.id
FROM search_tree
INNER JOIN modifier_items
ON "search_tree".id = "modifier_items".item_id
WHERE "modifier_items".modifier_id IN (
SELECT "modifiers".id
FROM modifiers
INNER JOIN item_modifiers ON "modifiers".id = "item_modifiers".modifier_id
WHERE "item_modifiers".item_id = "search_tree".id
)
WHERE NOT #{table_name}.id = ANY(path)
)
SELECT id FROM search_tree ORDER BY path
Есть идеи?