Kan iemand mij kort het verschil in gebruik uitleggen tussen de methoden uniq
en distinct
?
Ik heb beide in een vergelijkbare context gebruikt, maar het verschil is me niet helemaal duidelijk.
Antwoord 1, autoriteit 100%
Rails-query’s werken als arrays, dus .uniq
levert hetzelfde resultaat op als .distinct
, maar
.distinct
is de sql-querymethode.uniq
is de array-methode
Opmerking: In Rails 5+ is Relation#uniq
verouderd en wordt aanbevolen om in plaats daarvan Relation#distinct
te gebruiken.
Zie http://edgeguides.rubyonrails.org/5_0_release_notes.html#active-record- beëindigingen
Hint:
Als u .includes
gebruikt voordat u .uniq/.distinct
belt, kunt u uw app vertragenof versnellen, omdat
uniq
zal geen extra sql-query voortbrengendistinct
is voldoende
Maar beide resultaten zullen hetzelfde zijn
Voorbeeld:
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)
Dit kan handig zijn om een performante applicatie te maken
Hint:
Hetzelfde werkt voor
.size
vs.count
;present?
vs.exists?
map
vspluck
Antwoord 2, autoriteit 6%
Rails 5.1 heeft de uniq-methode verwijderd uit Activerecord Relation en de afzonderlijke methode toegevoegd…
- Als je uniq met query gebruikt, wordt de Activerecord Relaction gewoon geconverteerd naar Array-klasse…
- Je kunt geen Query-keten hebben als je daar uniq hebt toegevoegd….(dat wil zeggen dat je User.active.uniq.subscribe niet kunt doen, het zal een fout veroorzaken
undefined method subscribed for Array
) - Als uw DB groot is en u alleen vereiste afzonderlijke vermeldingen wilt ophalen, is het goed om de afzonderlijke methode te gebruiken met Activerecord Relation-query…
Antwoord 3, autoriteit 4%
Van de documentatie:
uniq(value = true)
Aliasvoor
ActiveRecord::QueryMethods#distinct
Antwoord 4, autoriteit 2%
Het is niet precies het antwoord op je vraag, maar wat ik weet is:
Als we de ActiveRecord-context beschouwen, dan is uniqslechts een alias voor distinct. En beide werken als het verwijderen van duplicaten op de set met queryresultaten (wat je tot op één niveau kunt zeggen).
En bij arraycontext is uniq zo krachtig dat het duplicaten verwijdert, zelfs als de elementen genest zijn. bijvoorbeeld
arr = [["first"], ["second"], ["first"]]
en als we dat doen
arr.uniq
het antwoord is: [["first"], ["second"]]
Dus zelfs als elementen blokken zijn, gaat het diep en verwijdert het duplicaten.
Ik hoop dat het je op een bepaalde manier helpt.