Ruby:深度合并yaml文件而不覆盖父级

时间:2016-02-22 11:56:56

标签: ruby-on-rails ruby internationalization yaml rails-i18n

我有两个来自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级深度的嵌套更深)

2 个答案:

答案 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"}}}