我有两个来自i18n的YAML文件,其中第一个文件中的某些键被覆盖在第二个文件中。我想将这两个YAML文件合并为一个,所以我将这两个文件读成哈希,并尝试合并它们:
a = {
en: {
test: {
bar: "bar",
foo: "foo"
}
}
}
b = {
en: {
test: {
bar: "hello world"
}
}
}
a.merge!(b)
puts a
# => {:de=>{:test=>{:bar=>"hello world"}}}
#
# but should return
# => {:de=>{:test=>{:bar=>"hello world", :foo => "foo"}}}
问题是,父键test
被完全覆盖。是否有一种简单的方法可以仅覆盖bar
但保留foo
的键/值?
(这只是一些例子,对于某些键,4或5级深度的嵌套更深)
答案 0 :(得分:2)
您正在寻找一种deep_merge
方法(或其被撞的兄弟姐妹)。幸运的是,它已经在rails中定义:
a.deep_merge!(b)
a #=> {:en=>{:test=>{:bar=>"hello world", :foo=>"foo"}}}
答案 1 :(得分:0)
在你的代码中你的合并en。用于与测试哈希合并:
a[:en][:test].merge!(b[:en][:test])
# => {:en=>{:test=>{:bar=>"hello world", :foo=>"foo"}}}