gpt4 book ai didi

mysql - RoR,需要在表关联中创建递归关系

转载 作者:行者123 更新时间:2023-11-29 17:50:23 27 4
gpt4 key购买 nike

我对 Rails 很陌生,并且对这个问题的逻辑有点困惑。

我有一张员工表(使用mysql),每个员工都有一个manager_id键,该键指的是他们向其汇报的员工。例如,标题为“CEO”且 id 为 1 的员工的 manager_id 为 nil,标题为“CTO”的员工的 manager_id 为 1。所以我的记录如下所示

id: 1, first_name: "Bob", last_name: "Boss", title: "CEO", manager_id: null
id: 2, first_name: "Pat", last_name: "Guy", title: "CTO", manager_id: 1
id: 3, first_name: "John", last_name: "Dude", title: "VP of engineering", manager_id: 2

我的 JSON 结构应该如下所示

    [
{id: 1, first_name: "Bob", last_name: "Boss", title: "CEO", manager_id: null, descendents: [
{id: 2, first_name: "Pat", last_name: "Guy", title: "CTO", manager_id: 1, descendents: [
{id: 3, first_name: "John", last_name: "Dude", title: "VP of engineering", manager_id: 2, descendents: [....]}
]},
{..more CEO descendents...}
]

我正在尝试创建一个从 CEO 开始的嵌套 JSON 结构,列出向他们报告的所有员工以及每个员工的后代。我试图编写一个脚本来创建它,但我不断收到无限的递归调用。这就是我所拥有的

        #start at some root
@root = Employee.find_by title: 'CEO'
#convert to hash table
@results[0] = @root.attributes
#add direct_reports key
@results[0]["direct_reports"] = []

def getBelow(root=@root)

@reports = Employee.where("manager_id = ?", @root[:id])

if @reports.blank?
return []
else
@reports = @reports.map(&:attributes)
@reports.each do |person|
person["direct_reports"] = []
getBelow(person)
end
@reports = Employee.where("manager_id = ?", @root[:id])
root["direct_reports"] = @reports
end

return @root
end

@list = getBelow(@results[0])

如果我传入每个新的 person 对象,当 @reports.blank 变为 true 时,它​​们最终是否都应该结束?

我想到的另一种选择是使用受这篇博文启发的表关联

https://hashrocket.com/blog/posts/recursive-sql-in-activerecord

但这似乎有点太复杂了。

最佳答案

getBelow方法中的一些问题

  • 您始终使用@root,而不是使用参数(root)。所以你总是从“CEO”重新开始。

  • 您正在递归调用 getBelow,但没有使用结果。

  • 您调用 @reports = Employee.where("manager_id = ?", @root[:id]) 两次。

  • 您返回@root。

正如 Jorge Najera 所说,有些 gem 可以轻松处理树结构。如果您想自己构建它,这是我的建议:

#start at some root
@root = Employee.find_by manager_id: nil

#convert to hash table
@tree = @root.attributes

#add direct_reports key
@tree["direct_reports"] = getBelow(@root)

def getBelow(manager)

branch = []

Employee.where("manager_id = ?", manager.id).each do |employee|
node = employee.attributes
node["direct_reports"] = getBelow(employee)
branch << node
end
branch

end

这尚未经过测试,因此我认为您会遇到一些错误,但我相信这个想法很好。

关于mysql - RoR,需要在表关联中创建递归关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49415060/

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