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
但它远远漂亮的代码。
什么是最好的方法来做这个建议?
你的代码看起来很简单。你可以用嵌套散列做很多事情。因为你的任务很容易,而我仍然与你一起初步解决方案,这也将工作;) new_hash = JSON.parse(old_hash.to_json.gsub(/(“amount”:“)(\ d +)( “)/,'\ 1- \ 2 \ 3')) – neongrau
请将实例缩减为最基本的要素。对于散列,这意味着要消除多余的键值对并缩短键和值。另外,为每个输入对象分配一个变量会很有帮助,这样读者就可以在文本和代码中引用这些变量而无需定义它们。例如,您的整个散列可以是'h = {“name”=>“abc”,attr1 => {123 => {:month => 1,:day => 2},attr2 => {“310” =“{”room“=>”7“,”amount“=> 15},”314“=> {”room“=>”98“,”amount“=> 25}}}}'。除此之外,读者现在可以在不需要水平滚动的情况下阅读代码。 –
谢谢你的建议,很快就会做到 –