这是一个可能的解决方案,它不会修改原始数据并创建一个新的散列。
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"
谢谢你,'deep_dup'是完美的 – iamse7en