Quelqu'un peut-il m'expliquer brièvement la différence d'utilisation entre les méthodes uniq
et distinct
?
J'ai vu les deux utilisés dans un contexte similaire, mais la différence n'est pas très claire pour moi.
Les requêtes Rails agissent comme des tableaux , donc .uniq
produit le même résultat que .distinct
, mais
.distinct
est la méthode de requête SQL.uniq
est une méthode de tableau Remarque : In Rails 5+ Relation#uniq
est obsolète et il est recommandé d'utiliser Relation#distinct
au lieu. Voir http://edgeguides.rubyonrails.org/5_0_release_notes.html#active-record-deprecations
Astuce :
En utilisant .includes
avant d'appeler .uniq/.distinct
peut ralentir ou accélérer votre application, car
uniq
ne générera pas de requête SQL supplémentairedistinct
fera l'affaireMais les deux résultats seront les mêmes
Exemple:
users = User.includes(:posts)
puts users
# First sql query for includes
users.uniq
# No sql query! (here you speed up you app)
users.distinct
# Second distinct sql query! (here you slow down your app)
Cela peut être utile pour rendre l'application performante
Astuce :
Mêmes travaux pour
.size
contre .count
;present?
contre .exists?
pluck
vs map
De la documentation :
uniq(value = true)
Alias pour
ActiveRecord::QueryMethods#distinct
Ce n'est pas exactement répondre à votre question, mais ce que je sais c'est:
Si nous considérons le contexte ActiveRecord alors niq est juste un alias pour distinct. Et les deux fonctionnent comme la suppression des doublons sur l'ensemble de résultats de la requête (ce que vous pouvez dire jusqu'à un niveau).
Et à array context uniq est si puissant qu'il supprime les doublons même si les éléments sont imbriqués. par exemple
arr = [["first"], ["second"], ["first"]]
et si nous le faisons
arr.uniq
la réponse sera: [["first"], ["second"]]
Donc, même si les éléments sont des blocs, il ira en profondeur et supprimera les doublons.
J'espère que cela vous aide à certains égards.