web-dev-qa-db-fra.com

Rails: uniq vs distinct

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.

24
Matthias

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émentaire
  • distinct fera l'affaire

Mais 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
53
itsnikolay

De la documentation :

uniq(value = true)

Alias ​​ pour ActiveRecord::QueryMethods#distinct

3
Зелёный

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.

2
Tushar H