gpt4 book ai didi

ruby-on-rails - 如何在 rails 中创建一个递归函数,它将返回 parent 的所有 child ,以及所有 child 的 child 等等......到 N 级

转载 作者:行者123 更新时间:2023-12-04 06:03:21 25 4
gpt4 key购买 nike

我有一个方法如图所示:

def all_pages_and_its_n_level_child

@parent_pages = Page.where(:parent_id => params[:page_id])
#this will give me all child of this page
for page in @parent_pages
child_exists=Page.where(:parent_id=>page.id)
#this will give all children of that page
#*I want to make this loop further so that i can check to N-levels,
#this is only for two levels*
end


end

最佳答案

在现代 RDB 上,递归 CTE 可用于处理递归结构。

class Page < ApplicationRecord; end

Page.find_by_sql(
"WITH RECURSIVE r AS (
#{Page.where(id: 2).to_sql}
UNION ALL
#{Page.joins('JOIN r').where('r.id = pages.parent_id').to_sql})
SELECT * FROM r")

# Page Load (0.7ms) WITH RECURSIVE r AS (
# SELECT `pages`.* FROM `pages` WHERE `pages`.`id` = 2
# UNION ALL
# SELECT `pages`.* FROM `pages` JOIN r WHERE (r.id = pages.parent_id))
# SELECT * FROM r
# => [#<Page id: 2, parent_id: 1, created_at: "2018-08-21 15:00:43", updated_at: "2018-08-21 15:00:43">, #<Page id: 3, parent_id: 2, created_at: "2018-08-21 15:00:50", updated_at: "2018-08-21 15:00:50">]
据我所知,mysql、postgres、sqlite3 支持递归 CTE。

编辑@2020/12/17
在 postgresql 上,您需要具备以下条件:
Page.find_by_sql(
"WITH RECURSIVE r AS (
#{Page.where(id: 2).to_sql}
UNION ALL
#{Page.joins('JOIN r ON r.id = pages.parent_id').to_sql})
SELECT * FROM r")
(感谢@Dan 指出)

关于ruby-on-rails - 如何在 rails 中创建一个递归函数,它将返回 parent 的所有 child ,以及所有 child 的 child 等等......到 N 级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11664233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com