2017-02-18 12 views
0

У меня есть этот массивный вложенный Рубиновый хэш:доступа и стоимость обновления в хэше хэш рубинового

hash_filter = { 
    "m-ct-filter-bot"=>{ 
    "parameters"=>{ 
     "filter_action"=>"keep", "filter_key"=>"classification.identifier", 
     "filter_regex"=>nil, "filter_value"=>"" 
    }, 
    "group"=>"Expert", "name"=>"Filter", "module"=>"bots.experts.filter.expert", 
    "description"=>"modified by mf370" 
    }, 
    "m-vision-filter-bot"=>{ 
    "parameters"=>{ 
     "filter_action"=>"keep", "filter_key"=>"classification.identifier", 
     "filter_regex"=>nil, "filter_value"=>"" 
    }, 
    "group"=>"Expert", "name"=>"Filter", "module"=>"bots.experts.filter.expert", 
    "description"=>"modified by mf370" 
    }, 
    "m-tele-filter-bot"=>{ 
    "parameters"=>{ 
     "filter_action"=>"keep", "filter_key"=>"classification.identifier", 
     "filter_regex"=>nil, "filter_value"=>"" 
    }, 
    "group"=>"Expert", "name"=>"Filter", "module"=>"bots.experts.filter.expert", 
    "description"=>"modified by mf370" 
    } 
} 

И этот массив:

array_id = ["ct","vision","tele"] 

Я пытаюсь обновить значение по ключевым "filter_value" на каждый вложенный хеш со значениями array_id. Для того чтобы иметь filter_value => ct, filter_value => vision, filter_value => tele на соответствующем хэше.

У меня есть следующий код:

array_id.each do |id| 
    hash_filter.each_pair do |key, value| 
    value["parameters"]["filter_value"] = id 
    end 
    end 

Однако, когда я запускаю этот код ключ filter_value обновляются ВСЕГДА с последним значением array_id, что означает, что все мои хэш будут иметь одинаковое значение filter_value => tele ,

Я не получаю никаких ошибок, это просто результат, которого я не ожидал. Можете ли вы, ребята, помочь мне? :)

спасибо !!

+0

В будущем, пожалуйста, чистить ваши примеры до минимума, необходимые для определения вашей точки. Здесь вопрос был бы более ясным, если бы ваш пример хэша был, например, 'filter = {ct: {a: {b:" keep ", value:" "}, c:" Exp "}, vision: {a: {b: "keep", value: ""}, c: "Exp"}, tele: {a: {b: "keep", value: ""}, c: "Exp"}} '. –

ответ

3

Это происходит потому, что вы перебираете array_id, поэтому ваше значение hash всегда будет таким же, как и последний элемент этого массива. Есть много вариантов, чтобы решить эту проблему. Но в следующий раз, вы должны быть более внимательными;) Благодаря @CarySwoveland:

a_id = array_id.dup 
hash_filter.each do |_key, value| 
    value["parameters"]["filter_value"] = a_id.shift 
end 
hash_filter 

Кроме того, для Ruby, V2.4.0 вы можете использовать новый метод: #transform_values

hash_filter.transform_values.with_index do |value, ind| 
    value["parameters"]["filter_value"] = array_id[ind] 
end 
hash_filter 
+0

спасибо! : D – mf370

+0

Вам не нужны индексы, если вы пишете 'a_id = array_id.dup; hash_filter.each {| _key, значение | value ["parameters"] ["filter_value"] = a_id.shift}; hash_filter'. Я добавил 'hash_filter' в конце, чтобы подчеркнуть, что ваш код не возвращает обновленный' hash_filter'. Кроме того, ваш метод # 1 мутирует 'hash_filter', тогда как [Hash # transform_values] (http://ruby-doc.org/core-2.4.0/Hash.html#method-i-transform_values) нет, что может быть немного запутанным. ([Hash # transform_values!] (Http://ruby-doc.org/core-2.4.0/Hash.html#method-i-transform_values-21) мутирует 'hash_filter'). –

+0

@CarySwoveland благодарит за внимание!) –