gpt4 book ai didi

Ruby 遍历嵌套对象的方法

转载 作者:太空宇宙 更新时间:2023-11-03 17:48:12 25 4
gpt4 key购买 nike

如何重写以下代码以使其更像 Ruby 风格?我正在考虑注入(inject),但不知道如何去做。

  def nested_page_path(page)
path = "/#{page.slug}"
while page.parent_id do
path.prepend "/#{page.parent.slug}"
page = page.parent
end
path
end

输入是一个 AR 对象,它有 0-5 个连续的父对象。输出类似于 '/pages/services/law'

最佳答案

如果您确定您的育儿过程中没有循环,您可以递归地进行,即。 e.有一个调用自身的函数。 5 层嵌套应该就可以了,数千个可能会出现问题。

def nested_page_path(page)
return "" if page.nil? # Or whatever that is root
"#{nested_page_path(page.parent)}/#{page.slug}"
end

但请记住,上述方法以及您的方法将在单独的查询中获取每个对象。如果您已经获取了它们,那很好,但如果没有,您就会遇到一些 N+1 查询问题。

一个简单的解决方法是缓存。您可以在 before_save 上重建此对象及其后代的嵌套路径:这是每次写入的一些重要开销。有更好的方法。

通过使用 nested sets您只需一次查询即可获得对象的层次结构分支。像这样:

page.self_and_ancestors.pluck(:slug).join('/')
# ^
# Nested sets' goodness

该查询的作用实质上是“获取按左边界排序的页面,其范围包含我自己的页面”。我正在使用 awesome_nested_set在我的示例中。

SELECT "pages"."slug" FROM "pages"
WHERE ("pages"."lft" <= 42) AND ("pages"."rgt" >= 88)
ORDER BY "pages"."lft"

关于Ruby 遍历嵌套对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30664813/

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