2016-08-24 64 views
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 

但它遠遠漂亮的代碼。

什麼是最好的方法來做這個建議?

+0

你的代碼看起來很簡單。你可以用嵌套散列做很多事情。因爲你的任務很容易,而我仍然與你一起初步解決方案,這也將工作;) new_hash = JSON.parse(old_hash.to_json.gsub(/(「amount」:「)(\ d +)( 「)/,'\ 1- \ 2 \ 3')) – neongrau

+0

請將實例縮減爲最基本的要素。對於散列,這意味着要消除多餘的鍵值對並縮短鍵和值。另外,爲每個輸入對象分配一個變量會很有幫助,這樣讀者就可以在文本和代碼中引用這些變量而無需定義它們。例如,您的整個散列可以是'h = {「name」=>「abc」,attr1 => {123 => {:month => 1,:day => 2},attr2 => {「310」 =「{」room「=>」7「,」amount「=> 15},」314「=> {」room「=>」98「,」amount「=> 25}}}}'。除此之外,讀者現在可以在不需要水平滾動的情況下閱讀代碼。 –

+0

謝謝你的建議,很快就會做到 –

回答

0

你可以用哈希做的事情不多,但可以通過它們循環。

不過,如果你保證的是,category_rate_requests哈希將永遠是一個元素(是否這是一個好主意,拋開參數),你可以跳過的東西,循環像

rate_params["category_rate_requests_attributes"].values.first["room_category_rates_attributes"].each{|key, room_category_rate| room_category_rate["amount"] = room_category_rate["amount"].to_i * -1} 

這假定哈希總是一樣的結構,但如果是這樣的話,你可以直接抓住category_rate_requests_attributes。知道它始終是一個元素的散列,請使用values來獲取它的值數組,取該數組的first(且僅限)元素,然後遍歷所生成的散列以反轉數量。

我不確定它有什麼「更好」,但它是另一種路徑。