我有一个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 :(得分: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
(和唯一)元素,然后循环结果哈希反转金额。
我不确定它是不是更好......但是它无论如何都是另一条道路。