Qual é a maneira mais elegante de selecionar objetos em uma matriz exclusivos em relação a um ou mais atributos?
Esses objetos são armazenados no ActiveRecord, portanto, o uso dos métodos de AR também seria bom.
ruby-on-rails
ruby
arrays
unique
sutee
fonte
fonte
require 'backports'
:-)@photos.uniq &:album_id
Adicione o
uniq_by
método à matriz em seu projeto. Funciona por analogia comsort_by
. Entãouniq_by
éuniq
comosort_by
ésort
. Uso:A implementação:
Observe que ele retorna uma nova matriz em vez de modificar a atual. Não escrevemos um
uniq_by!
método, mas deve ser fácil o suficiente, se você quiser.EDIT: Tribalvibes indica que essa implementação é O (n ^ 2). Melhor seria algo como (não testado) ...
fonte
Faça no nível do banco de dados:
fonte
Você pode usar esse truque para selecionar exclusivo por vários elementos de atributos da matriz:
fonte
Originalmente, eu sugeri o uso do
select
método Array. A saber:[1, 2, 3, 4, 5, 6, 7].select{|e| e%2 == 0}
nos[2,4,6]
devolve.Mas se você quiser o primeiro objeto desse tipo, use
detect
.[1, 2, 3, 4, 5, 6, 7].detect{|e| e>3}
nos dá4
.Não tenho certeza do que você está procurando aqui, no entanto.
fonte
Gosto do uso de um Hash por jmah para reforçar a exclusividade. Aqui estão mais algumas maneiras de esfolar esse gato:
Esse é um bom liner, mas suspeito que isso possa ser um pouco mais rápido:
fonte
Se entendi sua pergunta corretamente, resolvi esse problema usando a abordagem quase hacky de comparar os objetos Marshaled para determinar se algum atributo varia. A injeção no final do código a seguir seria um exemplo:
fonte
A maneira mais elegante que encontrei é um spin-off usando
Array#uniq
um bloco… Lê melhor também!
fonte
Você pode usar um hash, que contém apenas um valor para cada chave:
fonte
Use a Matriz # uniq com um bloco:
Ou uma abordagem mais concisa:
fonte
O Rails também possui um
#uniq_by
método.Referência: matriz parametrizada # uniq (ou seja, uniq_by)
fonte
Eu gosto das respostas de jmah e Head. Mas eles preservam a ordem dos arrays? Eles podem estar em versões posteriores do ruby, pois existem alguns requisitos de preservação de ordem de inserção de hash gravados na especificação da linguagem, mas aqui está uma solução semelhante que eu gosto de usar que preserva a ordem independentemente.
fonte
Implementação do ActiveSupport:
fonte
Agora, se você pode classificar os valores dos atributos, isso pode ser feito:
Isso é exclusivo para um atributo, mas a mesma coisa pode ser feita com classificação lexicográfica ...
fonte