我有一个Skill
模型,它有很多先决条件(或prereqs
在我的模型中),我需要为技能创建一个 N 级深度的先决条件图,因为我需要将此信息传递给 Javascript(在我的 gon gem 中)控制器)用于一些疯狂的 HTML5/KineticJS 动作,显示此技能与其他技能之间关系的鸟瞰图。
现在,下面的代码可以很好地一致地映射 5 个级别的深度。
delegate :url_helpers, to: 'Rails.application.routes'
def prereqs_map
prereqs_array = [ self.title.to_s, url_helpers.skill_path(self), Array.new(prereqs) ]
prereqs_array[2] = prereqs_array[2].map do |prereq1|
prereq1 = [ prereq1.title.to_s, url_helpers.skill_path(prereq1), Array.new(prereq1.prereqs).map do |prereq2|
prereq2 = [ prereq2.title.to_s, url_helpers.skill_path(prereq2), Array.new(prereq2.prereqs).map do |prereq3|
prereq3 = [ prereq3.title.to_s, url_helpers.skill_path(prereq3), Array.new(prereq3.prereqs).map do |prereq4|
prereq4 = [ prereq4.title.to_s, url_helpers.skill_path(prereq4), Array.new(prereq4.prereqs).map do |prereq5|
prereq5 = [ prereq5.title.to_s, url_helpers.skill_path(prereq5), [] ]
end ] # prereq depth 5
end ] # prereq depth 4
end ] # prereq depth 3
end ] # prereq depth 2
end # prereq depth 1
return prereqs_array
end
如您所见,问题在于嵌套映射非常混乱,我无法弄清楚传递depth
参数并将方法映射到我传递的任何深度。
我认为必须有更好的方法来做到这一点。有什么想法吗?