Я действительно не знаю, если заголовок правильный, но вопрос довольно прост:
У меня есть значение и ключ.
Ключ выглядит следующим образом:
"one.two.three"
Теперь, как мне установить этот хэш:
params['one']['two']['three'] = value
Использовать рекурсию:
def make_hash(keys) keys.empty? ? 1 : { keys.shift => make_hash(keys) } end puts make_hash("one.two.three".split '.') # => {"one"=>{"two"=>{"three"=>1}}}
Вы можете использовать метод inject:
inject
key = "one.two.three" value = 5 arr = key.split(".").reverse arr[1..-1].inject({arr[0] => value}){ |memo, i| {i => memo} } # => {"one"=>{"two"=>{"three"=>5}}}
Вы можете попробовать сделать это с помощью этого кода:
keys = "one.two.three".split '.' # => ["one", "two", "three"] params = {}; value = 1; i = 0; # i is an index of processed keys array element keys.reduce(params) { |hash, key| hash[key] = if (i += 1) == keys.length value # assign value to the last key in keys array else hash[key] || {} # initialize hash if it is not initialized yet (won't loose already initialized hashes) end } puts params # {"one"=>{"two"=>{"three"=>1}}}