在Ruby或Rails中,hash.merge({:order =>\'asc\'})可以返回带有新键的新哈希。什么可以返回带有已删除密钥的新哈希?

| 在Ruby(或Rails)中,我们可以
new_params = params.merge({:order => \'asc\'})
现在,
new_params
是带有添加键
:order
的哈希。 但是,是否有一行可以返回带有已删除密钥的哈希?线
new_params = params.delete(:order)
将无法工作,因为
delete
方法会返回该值,仅此而已。我们必须分三步进行吗?
tmp_params = params
tmp_params.delete(:order)
return tmp_params
有没有更好的办法?因为我想做一个
new_params = (params[:order].blank? || params[:order] == \'desc\') ? 
               params.merge({:order => \'asc\') : 
               (foo = params; foo.delete(:order); foo)   # return foo
但是上面的最后一行有些笨拙。有更好的方法吗? (注意:因为默认顺序为\'desc \',所以当没有
order
参数时,这意味着它是默认值,为
desc
,然后将其切换为添加
order=asc
,否则,只需删除参数
order
即可回到默认顺序
desc
已邀请:
ActiveSupport
增加了
Hash#except
方法:
h1 = { a: 1, b: 2, c: 3 }
h1.except(:a) #=> {:b=>2, :c=>3}
一个更复杂的示例:
h1 = { a:1, b: 2, c: 3 }
h2 = { b: 3, d: 5 }
h1.merge(h2).except(*h1.keys-h2.keys) #=> {:b=>3, :d=>5}
这将用
h2
中的密钥更新
h1
中的密钥,从
h2
中添加新密钥,并删除
h1
中但不在
h2
中的密钥。
使用拒绝:
{:hello=> \'aaa\'}.reject {| key, value | key == :hello} #=> {}
如果您不想依赖ActiveSupport,可以使用: params.delete_if {|键,值|键==:order}

要回复问题请先登录注册