我有一個Skill
模型,它有許多先決條件(或prereqs
在我的模型中),我需要創建一個N層深度的地圖這是技能的先決條件,因爲我需要將這些信息傳遞給JavaScript(在我的控制器中使用gon寶石),以獲得一些瘋狂的HTML5/KineticJS動作,該動作顯示了該技能與其他人之間關係的鳥瞰圖。試圖構建一個嵌套數組的數組來映射N個關聯深入Rails模型
現在,下面的代碼非常適合深入地描繪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
參數,並有方法映射出任何深度I通過。
我認爲必須有一個更好的方法來做到這一點。有什麼想法嗎?
似乎是遞歸一個完美的候選人,但它真的很難理解它是如何工作 – apneadiving
你確認'prereq1.prereqs'是一個整數? – apneadiving
@apneadiving它似乎是一個遞歸的完美候選人,但我無法弄清楚如何使用遞歸。 prereq1.prereqs不是一個整數。這是一系列其他技能,已作爲先決條件添加到此技能中。 –