Ruby on rails Ruby修改嵌套哈希的元素

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

我有一个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
但这远远不是好代码


关于什么是最好的方法有什么建议吗?

对于散列,您可以做的不多,但可以循环使用它们

但是,如果保证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}
。除此之外,读者现在无需水平滚动即可阅读您的代码。谢谢您的建议,我们将很快完成