Rails: uniek vs. onderscheidend

Kan iemand mij kort het verschil in gebruik uitleggen tussen de methoden uniqen 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 .uniqlevert hetzelfde resultaat op als .distinct, maar

  • .distinctis de sql-querymethode
  • .uniqis de array-methode

Opmerking: In Rails 5+ is Relation#uniqverouderd en wordt aanbevolen om in plaats daarvan Relation#distinctte gebruiken.
Zie http://edgeguides.rubyonrails.org/5_0_release_notes.html#active-record- beëindigingen

Hint:

Als u .includesgebruikt voordat u .uniq/.distinctbelt, kunt u uw app vertragenof versnellen, omdat

  • uniqzal geen extra sql-query voortbrengen
  • distinctis 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

  • .sizevs .count;
  • present?vs .exists?
  • mapvs pluck

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.

Other episodes