Quelle est la manière la plus élégante de sélectionner des objets dans un tableau qui sont uniques par rapport à un ou plusieurs attributs?
Ces objets sont stockés dans ActiveRecord, donc utiliser les méthodes d'AR serait également très bien.
ruby-on-rails
ruby
arrays
unique
sutee
la source
la source
require 'backports'
:-)@photos.uniq &:album_id
Ajoutez la
uniq_by
méthode à Array dans votre projet. Cela fonctionne par analogie avecsort_by
. Il enuniq_by
va de même pouruniq
telsort_by
quelsort
. Usage:La mise en oeuvre:
Notez qu'il renvoie un nouveau tableau plutôt que de modifier votre tableau actuel sur place. Nous n'avons pas écrit de
uniq_by!
méthode mais cela devrait être assez simple si vous le souhaitez.EDIT: Tribalvibes souligne que cette implémentation est O (n ^ 2). Mieux vaut quelque chose comme (non testé) ...
la source
Faites-le au niveau de la base de données:
la source
Vous pouvez utiliser cette astuce pour sélectionner unique par plusieurs éléments d'attributs du tableau:
la source
J'avais initialement suggéré d'utiliser la
select
méthode sur Array. En être témoin:[1, 2, 3, 4, 5, 6, 7].select{|e| e%2 == 0}
nous rend[2,4,6]
.Mais si vous voulez le premier objet de ce type, utilisez
detect
.[1, 2, 3, 4, 5, 6, 7].detect{|e| e>3}
nous donne4
.Je ne suis pas sûr de ce que vous faites ici, cependant.
la source
J'aime l'utilisation par jmah d'un Hash pour renforcer l'unicité. Voici quelques autres façons d'écorcher ce chat:
C'est un joli 1-liner, mais je suppose que cela pourrait être un peu plus rapide:
la source
Si je comprends bien votre question, j'ai abordé ce problème en utilisant l'approche quasi-hacky de comparaison des objets Marshaled pour déterminer si des attributs varient. L'injection à la fin du code suivant serait un exemple:
la source
Le moyen le plus élégant que j'ai trouvé est un spin-off utilisant
Array#uniq
avec un bloc… Ça se lit mieux aussi!
la source
Vous pouvez utiliser un hachage, qui ne contient qu'une seule valeur pour chaque clé:
la source
Utilisez Array # uniq avec un bloc:
Ou une approche plus concise:
la source
Rails a également une
#uniq_by
méthode.Référence: Parameterized Array # uniq (ie, uniq_by)
la source
J'aime les réponses de Jmah et Head. Mais préservent-ils l'ordre des tableaux? Ils pourraient le faire dans les versions ultérieures de ruby car il y a eu des exigences de préservation de l'ordre d'insertion de hachage écrites dans la spécification du langage, mais voici une solution similaire que j'aime utiliser qui préserve l'ordre malgré tout.
la source
Implémentation ActiveSupport:
la source
Maintenant, si vous pouvez trier les valeurs d'attribut, cela peut être fait:
C'est pour un attribut unique, mais la même chose peut être faite avec le tri lexicographique ...
la source