2016-08-24 62 views
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 

但它远远漂亮的代码。

什么是最好的方法来做这个建议?

+0

你的代码看起来很简单。你可以用嵌套散列做很多事情。因为你的任务很容易,而我仍然与你一起初步解决方案,这也将工作;) new_hash = JSON.parse(old_hash.to_json.gsub(/(“amount”:“)(\ d +)( “)/,'\ 1- \ 2 \ 3')) – neongrau

+0

请将实例缩减为最基本的要素。对于散列,这意味着要消除多余的键值对并缩短键和值。另外,为每个输入对象分配一个变量会很有帮助,这样读者就可以在文本和代码中引用这些变量而无需定义它们。例如,您的整个散列可以是'h = {“name”=>“abc”,attr1 => {123 => {:month => 1,:day => 2},attr2 => {“310” =“{”room“=>”7“,”amount“=> 15},”314“=> {”room“=>”98“,”amount“=> 25}}}}'。除此之外,读者现在可以在不需要水平滚动的情况下阅读代码。 –

+0

谢谢你的建议,很快就会做到 –

回答

0

你可以用哈希做的事情不多,但可以通过它们循环。

不过,如果你保证的是,category_rate_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} 

这假定哈希总是一样的结构,但如果是这样的话,你可以直接抓住category_rate_requests_attributes。知道它始终是一个元素的散列,请使用values来获取它的值数组,取该数组的first(且仅限)元素,然后遍历所生成的散列以反转数量。

我不确定它有什么“更好”,但它是另一种路径。