Ruby on rails Ruby修改嵌套哈希的元素
我有一个RoR应用程序,在其中的某个时刻,我接收到一些散列形式的参数。散列中重复了一个字段Ruby on rails Ruby修改嵌套哈希的元素,ruby-on-rails,ruby,hash,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
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
但这远远不是好代码
关于什么是最好的方法有什么建议吗?对于散列,您可以做的不多,但可以循环使用它们 但是,如果保证category\u rate\u 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}
这假设散列总是相同的结构,但如果是这种情况,您可以直接获取类别\速率\请求\属性。知道它始终是一个单元素散列,使用values
获取它的值的数组,获取该数组的第一个(也是唯一的)元素,并循环通过结果散列来反转数量
我不确定这是否“更好”,但无论如何,这是另一条路。您的代码似乎非常简单。使用嵌套哈希不能做很多事情。由于您的任务非常简单,而我仍然会与您一起使用初始解决方案,因此这也会起作用;)新的_hash=JSON.parse(旧的_hash.to _JSON.gsub(/(“金额”)(\d+(“)/,“\1-\2\3”)请将示例缩减到其基本内容。对于散列,这意味着消除无关的键值对并缩短键和值。另外,为每个输入对象分配一个变量也很有帮助,这样读者就可以在文本和代码中引用这些变量,而无需定义它们。例如,您的整个散列可以是h={“name”=>“abc”,attr1=>{123=>{:month=>1,:day=>2},attr2=>{“310”=>{“room”=>“7”,“amount”=>15},“314”=>{“room”=>“98”,“amount”=>25}
。除此之外,读者现在无需水平滚动即可阅读您的代码。谢谢您的建议,我们将很快完成