138 votes

Uniq par attribut d'objet en Ruby

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 étant stockés dans ActiveRecord, l’utilisation des méthodes de AR conviendrait également.

221voto

张健健 Points 708

Utilisez Array#uniq avec un bloc:

 @photos = @photos.uniq {|p| p.album_id}
 

22voto

Daniel Lucraft Points 3323

Ajouter l' uniq_by méthode de Tableau dans votre projet. Il fonctionne par analogie avec l' sort_by. Donc, uniq_by est uniq comme sort_by est sort. Utilisation:

uniq_array = my_array.uniq_by {|obj| obj.id}

La mise en œuvre:

class Array
  def uniq_by(&blk)
    transforms = []
    self.select do |el|
      should_keep = !transforms.include?(t=blk[el])
      transforms << t
      should_keep
    end
  end
end

Notez qu'il retourne un nouveau tableau plutôt que de modifier votre actuel en place. Nous n'avons pas écrit une uniq_by! méthode, mais il devrait être assez facile, si vous vouliez.

EDIT: Tribalvibes souligne que cette mise en œuvre est O(n^2). Mieux serait quelque chose comme (non testé)...

class Array
  def uniq_by(&blk)
    transforms = {}
    select do |el|
      t = blk[el]
      should_keep = !transforms[t]
      transforms[t] = true
      should_keep
    end
  end
end

17voto

mislav Points 7379

Faites-le au niveau de la base de données:

 YourModel.find(:all, :group => "status")
 

6voto

Pi. Points 2004

J'avais initialement suggéré d'utiliser la méthode select sur Array. En être témoin:

[1, 2, 3, 4, 5, 6, 7].select{|e| e%2 == 0} nous renvoie [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 donne 4 .

Je ne sais pas trop ce que vous allez faire ici.

5voto

Head Points 2233

J’aime utiliser de jmah un hachage pour appliquer l’unicité. Voici un couple plus de moyens pour que le chat de la peau :

C’est une belle 1-liner, mais je soupçonne que cela pourrait être un peu plus vite :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X