2016-11-21 3 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}]} 

Ich brauche diese genaue Struktur zu behalten, nur ändern/aktualisieren Sie den Wert der ersten "line" zu was auch immer, lassen Sie sich 20 sagen, es ist immer die gleiche genaue Stelle, die ich müssen aktualisieren/ändern. Ich habe versucht, eine Reihe von Hash#methods nur Syntaxfehler oder die bestehende Struktur zu ändern. Vielen Dank!eine verschachtelte Hash von Arrays und Hashes

Antwort

1

Hier ist eine mögliche Lösung, die die ursprünglichen Daten nicht ändert und einen neuen Hash erstellt.

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"}]} 

Wenn Sie wirklich nur das erste Auftreten von line ändern möchten, können Sie einfach tun:

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

danke, 'deep_dup' perfekt – iamse7en

Verwandte Themen