【发布时间】:2018-10-02 07:26:31
【问题描述】:
我的json:
{
"catalogs": {
"name": "catalog 1C",
"children": [{
"name": "Philips",
"children": {}
},
{
"name": "BenQ",
"children": [{
"name": "Monitor",
"children": [{
"name": "19 inches",
"children": [{"name": "IPS", "children": {}},
{"name": "TFT","children": {}}]
},
{
"name": "24 inches",
"children": {} }]
}]
}
]
}
}
Json 相互之间具有相同的键和嵌套级别。
сhildren 可以有多个目录(例如 IPS、TFT )。
这是一个菜单,其中一些项目应位于同一级别。我用宝石ancestry
我写了一个递归函数(在控制器中):
def call
# file - inside the json to parse
data_hash = JSON.parse(file)
data_hash["catalogs"]["children"].each do |k|
ancestry = Category.create_with(name: k["name"]).find_or_create_by!(uid_catalog: k["uid_catalog"])
if k["children"].present?
k["children"].each do |parent|
parent["children"].each do |child|
walk_tree(child, ancestry)
end
end
end
end
end
def walk_tree(root, ancestry)
ancestry = ancestry.children.find_or_create_by!(name: root["name"])
root["children"].each do |child|
ancestry = ancestry.children.find_or_create_by!(name: child["name"])
walk_tree(child["children"], ancestry) if child["children"].present?
end
end
目前函数输出:
- BenQ
- 19 inches
- IPS
- TFT
我想要这样(缺一级Monitor):
- BenQ
- Monitor
- 19 inches
- IPS
- TFT
- 24 inches
【问题讨论】:
-
请提供
load_categories的完整代码。目前尚不清楚ancestry属性从何而来。 -
done) 稍作修改,但逻辑是一样的
-
谢谢,这样更好
标签: ruby-on-rails json ruby