В Ruby или Rails hash.merge ({: order => 'asc'}) может вернуть новый хеш с новым ключом.Что может вернуть новый хеш с удаленным ключом? - PullRequest
5 голосов
/ 19 апреля 2011

В Ruby (или Rails) мы можем сделать

new_params = params.merge({:order => 'asc'})

и теперь new_params - это хеш с добавленным ключом :order.

Но есть ли строка, в которой можно вернуть хэш с удаленным ключом? Линия

new_params = params.delete(:order)

не будет работать, потому что метод delete возвращает значение и все. Должны ли мы сделать это в 3 шага?

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)

Ответы [ 3 ]

10 голосов
/ 19 апреля 2011

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}

Это обновит ключи, которые присутствуют в h1, с ключамив h2 добавьте новые из h2 и удалите те, которые находятся в h1, но не в h2.

1 голос
/ 19 апреля 2011

Если вы не хотите зависеть от ActiveSupport, вы можете использовать:

params.delete_if {|key, value| key == :order }
1 голос
/ 19 апреля 2011

Использовать отказ:

{:hello=> 'aaa'}.reject {| key, value | key == :hello} #=> {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...