3

深くて異なる構造の yml 構成ファイルをいくつか取得しました。パスワード (異なるレベルにある) を抽出し、それらを git リポジトリの外部の yml ファイルに保存したいと考えています。例を示しましょう

config1.yml

a:
  b:
    c: 1
    password: secret
    ...
  d: 2
  ...

次のような別のymlファイルにパスを置き換えsecretて抽出したいと思います。''

config1_passwords.yml

a:
  b:
    password: secret

正しい構成構造を取得するためにconfig1.ymlパスワードなしでマージする方法はありますか?config1_passwords.yml

したがって、基本的にハッシュ(解析されたyml)に関して、私は次のことをしたいと思います:

{ :a => { :b => { :c => 1, :password => '' }, :d => 2 } }
{ :a => { :b => { :password => 'secret' } } } 
# =>
{ :a => { :b => { :c => 1, :password => 'secret' }, :d => 2 } }

提案をありがとう

別の例 を編集しました

{ :a => { :b => { :c => 1, :d => { :password1 => '' }, :password2 => '' } } }
{ :a => { :b => { :d => { :password => 'secret' }, :password2 => 'secret2' } } }
# =>
{ :a => { :b => { :c => 1, :d => { :password => 'secret' }, :password2 => 'secret2' } } }
4

3 に答える 3

4

Rails 3には がありdeep_merge、これはまさにあなたが望むことを行います。

a = { :a => { :b => { :c => 1, :d => { :password1 => '' }, :password2 => '' } } }
b = { :a => { :b => { :d => { :password1 => 'secret' }, :password2 => 'secret2' } } }
a.deep_merge(b)
# -> {:a=> {:b=> {:c=>1, :d=>{:password1=>"secret"}, :password2=>"secret2"}}}

注:の代わりにa[:a][:b][:d]含むように変更しました。:password1:password

于 2013-05-03T14:45:04.670 に答える
2

ある種のハッシュディープマージが必要なようです。ActiveSupport (Rails の一部) で利用できます。

# You can omit this require statement if you're running Rails.
require "active_support/core_ext/hash/deep_merge"

a = { a: { b: { c: 1, d: { password1: "" }, password2: "" } } }
b = { a: { b: { d: { password1: "secret" }, password2: "secret2" } } }

a.deep_merge(b)
#=> { a: { b: { c: 1, d: { password1: "secret"}, password2: "secret2" } } }

ActiveSupport に依存したくない場合は、実装をご覧ください。

于 2013-05-03T14:44:24.037 に答える
2

これが Ruby ワンライナーを使用して実行できるとは思わないでください。しかし、単純な再帰関数で十分かもしれません

def recurse_merge_password! conf_hash, pw_hash
  pw_hash.keys.each do |k|
    next unless conf_hash.has_key?(k)
    case
      when k == :password
        conf_hash[:password] = pw_hash[:password]
      when conf_hash[k].is_a?(Hash) && pw_hash[k].is_a?(Hash)
        recurse_merge_password! conf_hash[k], pw_hash[k]
    end
  end
end

h1 = { :a => { :b => { :c => 1, :password => '' }, :d => 2 } }

h2 = { :a => { :b => { :password => "secret" } } }

recurse_merge_password! h1, h2

puts h1.inspect

=> {:a=>{:b=>{:c=>1, :password=>"secret"}, :d=>2}}

トラバースする必要のある配列やその他の構造がある場合、これを改善するのはあなた次第です。構成をその場で変更したことに注意してください。

于 2013-05-03T14:43:48.470 に答える