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

Ruby on rails 在Ruby或Rails中,hash.merge({:order=>;';asc';})可以返回一个带有新键的新哈希。什么可以返回带有已删除密钥的新哈希?,ruby-on-rails,ruby,Ruby On Rails,Ruby,在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

在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
param时,这意味着它是默认的并且是
desc
,然后将其切换到add
order=asc
,否则,只需删除param
order
,使其返回到
desc
的默认顺序)
ActiveSupport
添加了一个
Hash#除了
方法之外:

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 {|key, value| key == :order } params.delete_如果{| key,value | key==:order}
是否要更改(析构函数)
参数
?如果您这样做,您应该直接按照
tmp\u参数执行。删除(:order)
。如果没有,则需要在
delete
之前
dup
。总之,
except
reject
方法不会更改原始散列,而
delete\u如果
实际更改了原始散列