2016-11-21 123 views
-2
{"8933"=> 
    [{"id"=>419, 
    "game_id"=>8933, 
    "user_id"=>1, 
    "line"=>21, 
    "created_at"=>Mon, 21 Nov 2016 02:27:16 EST -05:00, 
    "updated_at"=>Mon, 21 Nov 2016 02:27:16 EST -05:00}], 
"8690"=> 
    [{"id"=>401, 
    "game_id"=>8690, 
    "user_id"=>1, 
    "line"=>#<BigDecimal:7fdd42d96670,'-0.5E0',9(18)>, 
    "created_at"=>Wed, 16 Nov 2016 21:55:59 EST -05:00, 
    "updated_at"=>Wed, 16 Nov 2016 21:55:59 EST -05:00}]} 

我需要保留这个确切的结构,只有改变/更新第一"line"到任何的价值,让我们说20.永远是这个相同的确切位置,我会需要更新/修改。我试了一大堆Hash#methods只是遇到语法错误或改变现有的结构。谢谢!修改阵列的嵌套哈希和哈希

回答

1

这是一个可能的解决方案,它不会修改原始数据并创建一个新的散列。

data = { 
    "8933"=> 
    [ 
    { 
     "id"=>419, 
     "game_id"=>8933, 
     "user_id"=>1, 
     "line"=>21, 
     "created_at"=>"Mon, 21 Nov 2016 02:27:16 EST -05:00", 
     "updated_at"=>"Mon, 21 Nov 2016 02:27:16 EST -05:00" 
    } 
    ], 
    "8690"=> 
    [ 
    { 
     "id"=>401, 
     "game_id"=>8690, 
     "user_id"=>1, 
     "line"=>-5, 
     "created_at"=>"Wed, 16 Nov 2016 21:55:59 EST -05:00", 
     "updated_at"=>"Wed, 16 Nov 2016 21:55:59 EST -05:00" 
    } 
    ] 
} 

# Use deep_copy if you use Ruby only. Use data.deep_dup if you use Rails 
def deep_copy(o) 
    Marshal.load(Marshal.dump(o)) 
end 

modified_data = deep_copy(data) 

modified_data.each{|n,array| 
    array.each{|ids| 
    ids["line"] = "whatever" 
    } 
} 

require 'pp' 

pp modified_data 
puts "-----" 
pp data 

# {"8933"=> 
# [{"id"=>419, 
#  "game_id"=>8933, 
#  "user_id"=>1, 
#  "line"=>"whatever", 
#  "created_at"=>"Mon, 21 Nov 2016 02:27:16 EST -05:00", 
#  "updated_at"=>"Mon, 21 Nov 2016 02:27:16 EST -05:00"}], 
# "8690"=> 
# [{"id"=>401, 
#  "game_id"=>8690, 
#  "user_id"=>1, 
#  "line"=>"whatever", 
#  "created_at"=>"Wed, 16 Nov 2016 21:55:59 EST -05:00", 
#  "updated_at"=>"Wed, 16 Nov 2016 21:55:59 EST -05:00"}]} 
# ----- 
# {"8933"=> 
# [{"id"=>419, 
#  "game_id"=>8933, 
#  "user_id"=>1, 
#  "line"=>21, 
#  "created_at"=>"Mon, 21 Nov 2016 02:27:16 EST -05:00", 
#  "updated_at"=>"Mon, 21 Nov 2016 02:27:16 EST -05:00"}], 
# "8690"=> 
# [{"id"=>401, 
#  "game_id"=>8690, 
#  "user_id"=>1, 
#  "line"=>-5, 
#  "created_at"=>"Wed, 16 Nov 2016 21:55:59 EST -05:00", 
#  "updated_at"=>"Wed, 16 Nov 2016 21:55:59 EST -05:00"}]} 

如果你真的只是想修改line第一次出现,你可以做:

data.values.first.first["line"] = "whatever" 
+0

谢谢你,'deep_dup'是完美的 – iamse7en