Ruby修改嵌套哈希的元素

时间:2016-08-24 14:48:40

标签: ruby-on-rails ruby hash

我有一个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

但它远不是很好的代码。

有关最佳方法的建议吗?

1 个答案:

答案 0 :(得分:0)

你可以用哈希做很多事情,但是要经过它们。

但是,如果您确保category_rate_requests哈希将始终是一个元素(关于这是否是一个好主意的争论),您可以跳过该循环,例如

Python 2.7.11 |Anaconda custom (64-bit)| (default, Feb 16 2016, 09:58:36) [MSC v.1500 64 bit (AMD64)] on win32

这假设散列总是相同的结构,但如果是这种情况,您可以直接抓取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(和唯一)元素,然后循环结果哈希反转金额。

我不确定它是不是更好......但是它无论如何都是另一条道路。