我是红宝石领域的新手,在使用hashes时遇到了很多困难。在Ruby中似乎有很多方法来做同样的事情,但是我遇到的问题是在现有哈希的子级别上分配散列。
例如,在我的类中,我有以下代码:
@query_hash = {"term" => {"field" => "value"}
@main_hash["query"]["filtered"]["query"]["bool"] = @query_hash
问题是有时
@main_hash
中缺少一个子散列,所以上面的路径会有一个键,比如"filtered"
中缺少"query"
或@main_hash
,我会得到一个与nil相关的异常所以我要做的是,当我深入到散列中时,首先检查每一层嵌套,然后再引用下一层。如果这个级别不存在,我必须以这样一个丑陋的方式初始化那个子哈希:@main_hash["query"] = {"filtered" => {"query" => "bool"}}
有没有更干净和更简单的方法来处理这种杂碎咀嚼?
最佳答案
这仅仅是对@Ryan Bigg答案的概括。
假设:
main_hash = { "query1"=>
{ "filtered"=>
{ "query2"=>"value" }
}
}
nested_keys = ["query1", "filtered", "cat", "dog"]
query_hash = { "term"=>
{ "field"=>"value" }
}
然后:
nested_keys.reduce(main_hash) { |h,k|
h[k].is_a?(Hash) ? h[k] : h[k] = {} }.update(query_hash)
main_hash
#=> { "query1"=>
# { "filtered"=>
# { "query2"=> "value",
# "cat"=>
# { "dog"=>
# {"term"=>
# {"field"=>"value"}
# }
# }
# }
# }
# }
注意
h[k].is_a?(Hash)
提供双重任务:它检查h
是否有一个键k
,如果有,则检查h[k]
是否是散列。