2
我有一個RoR應用程序,其中在某些時候我收到了一些散列形式的參數。在散列內重複了一個字段amount
。我想把這些領域的價值顛倒過來。 這是嵌套的散列的例子:紅寶石修改嵌套散列的元素
{"name"=>"asdasd", "rate_type"=>"DependantRate",
"category_rate_requests_attributes"=>{
"0"=>{
"date_from"=>"2016-08-03", "date_to"=>"2016-08-03",
"room_category_rates_attributes"=>{
"0"=>{"r_id"=>"7", "amount"=>"5"},
"1"=>{"r_id"=>"98", "amount"=>"15"},
"2"=>{"r_id"=>"3", "amount"=>"25"},
"3"=>{"r_id"=>"1", "amount"=>"35"},
"4"=>{"r_id"=>"115", "amount"=>"45"},
"5"=>{"r_id"=>"116", "amount"=>"55"},
"6"=>{"r_id"=>"117", "amount"=>"65"}
}
},
"1"=>{
"date_from"=>"2016-08-05", "date_to"=>"2016-08-07",
"room_category_rates_attributes"=>{
"0"=>{"r_id"=>"7", "amount"=>"3"},
"1"=>{"r_id"=>"98", "amount"=>"13"},
"2"=>{"r_id"=>"3", "amount"=>"23"},
"3"=>{"r_id"=>"1", "amount"=>"33"},
"4"=>{"r_id"=>"115", "amount"=>"43"},
"5"=>{"r_id"=>"116", "amount"=>"53"},
"6"=>{"r_id"=>"117", "amount"=>"63"}
}
}
}
}
我想獲得具有新的哈希amount
字段的值相同,但負,如:
{"name"=>"asdasd", "rate_type"=>"DependantRate",
"category_rate_requests_attributes"=>{
"0"=>{
"date_from"=>"2016-08-03", "date_to"=>"2016-08-03",
"room_category_rates_attributes"=>{
"0"=>{"r_id"=>"7", "amount"=>-5},
"1"=>{"r_id"=>"98", "amount"=>-15},
"2"=>{"r_id"=>"3", "amount"=>-25},
"3"=>{"r_id"=>"1", "amount"=>-35},
"4"=>{"r_id"=>"115", "amount"=>-45},
"5"=>{"r_id"=>"116", "amount"=>-55},
"6"=>{"r_id"=>"117", "amount"=>-65}
}
},
"1"=>{
"date_from"=>"2016-08-05", "date_to"=>"2016-08-07",
"room_category_rates_attributes"=>{
"0"=>{"r_id"=>"7", "amount"=>-3},
"1"=>{"r_id"=>"98", "amount"=>-13},
"2"=>{"r_id"=>"3", "amount"=>-23},
"3"=>{"r_id"=>"1", "amount"=>-33},
"4"=>{"r_id"=>"115", "amount"=>-43},
"5"=>{"r_id"=>"116", "amount"=>-53},
"6"=>{"r_id"=>"117", "amount"=>-63}
}
}
}
}
(是的,這些值現在是數字,但只要它們是負數,它們是字符串還是數字並不重要)。
這就是我想出了:
rate_params[:category_rate_requests_attributes].try(:each) do |_key1, category_rate_request|
category_rate_request[:room_category_rates_attributes].each do |_key2, room_category_rate|
room_category_rate[:amount] = room_category_rate[:amount].to_i * -1
end
end
但它遠遠漂亮的代碼。
什麼是最好的方法來做這個建議?
你的代碼看起來很簡單。你可以用嵌套散列做很多事情。因爲你的任務很容易,而我仍然與你一起初步解決方案,這也將工作;) new_hash = JSON.parse(old_hash.to_json.gsub(/(「amount」:「)(\ d +)( 「)/,'\ 1- \ 2 \ 3')) – neongrau
請將實例縮減爲最基本的要素。對於散列,這意味着要消除多餘的鍵值對並縮短鍵和值。另外,爲每個輸入對象分配一個變量會很有幫助,這樣讀者就可以在文本和代碼中引用這些變量而無需定義它們。例如,您的整個散列可以是'h = {「name」=>「abc」,attr1 => {123 => {:month => 1,:day => 2},attr2 => {「310」 =「{」room「=>」7「,」amount「=> 15},」314「=> {」room「=>」98「,」amount「=> 25}}}}'。除此之外,讀者現在可以在不需要水平滾動的情況下閱讀代碼。 –
謝謝你的建議,很快就會做到 –