En Ruby ou Rails, de hachage.de fusion({:commande => 'asc'}) peut retourner une nouvelle table de hachage avec une nouvelle clé. Ce qui peut revenir une nouvelle table de hachage avec une clé supprimée?
En Ruby (ou Rails), nous pouvons faire
new_params = params.merge({:order => 'asc'})
et maintenant new_params
est un hachage avec clé :order
.
Mais est-il une ligne, il peut retourner la valeur de hachage avec une clé supprimée? La ligne
new_params = params.delete(:order)
ne fonctionnera pas parce que les delete
méthode retourne la valeur et c'est tout. Devons-nous le faire en 3 étapes?
tmp_params = params
tmp_params.delete(:order)
return tmp_params
Est-il un meilleur moyen? Parce que je veux faire un
new_params = (params[:order].blank? || params[:order] == 'desc') ?
params.merge({:order => 'asc') :
(foo = params; foo.delete(:order); foo) # return foo
mais la dernière ligne ci-dessus est quelque peu maladroit. Est-il un meilleur moyen de le faire?
(remarque: la valeur par défaut est 'desc', donc quand il n'y a pas de order
param, cela signifie que c'est la valeur par défaut est desc
, puis bascule à ajouter order=asc
, mais sinon, il suffit de retirer le param order
de sorte qu'il est de retour à l'ordre par défaut des desc
)
- Voulez-vous changer (destruction)
params
? Si vous le faites, vous devriez le faire directement commetmp_params.delete(:order)
. Si non, vous devezdup
avantdelete
.
Vous devez vous connecter pour publier un commentaire.
ActiveSupport
ajoute unHash#except
méthode:Un exemple plus compliqué:
Cela permettra de mettre à jour les clés qui sont présents dans
h1
avec ceux qui sont dansh2
, ajouter les nouveauxh2
et de supprimer ceux qui sont dansh1
mais pas dansh2
.utilisation rejeter:
Si vous ne voulez pas dépendre de l'ActiveSupport vous pouvez utiliser:
except
etreject
méthode ne change pas le hachage d'origine, tandis quedelete_if
le hachage d'origine