Jaki jest najbardziej elegancki sposób wybierania obiektów w tablicy, które są unikalne pod względem jednego lub więcej atrybutów?
Te obiekty są przechowywane w ActiveRecord, więc użycie metod AR również byłoby w porządku.
ruby-on-rails
ruby
arrays
unique
sutee
źródło
źródło
require 'backports'
:-)@photos.uniq &:album_id
Dodaj
uniq_by
metodę do Array w swoim projekcie. Działa przez analogię zsort_by
. Takuniq_by
jest,uniq
jaksort_by
jestsort
. Stosowanie:Implementacja:
Zwróć uwagę, że zwraca on nową tablicę, zamiast modyfikować bieżącą w miejscu. Nie napisaliśmy
uniq_by!
metody, ale powinna być dość łatwa, jeśli chcesz.EDYCJA: Tribalvibes zwraca uwagę, że ta implementacja to O (n ^ 2). Lepiej byłoby coś takiego (niesprawdzone) ...
źródło
Zrób to na poziomie bazy danych:
źródło
Możesz użyć tej sztuczki, aby wybrać unikalne przez kilka atrybutów elementów z tablicy:
źródło
Początkowo sugerowałem użycie
select
metody w Array. Dowcip:[1, 2, 3, 4, 5, 6, 7].select{|e| e%2 == 0}
oddaje nam[2,4,6]
.Ale jeśli chcesz mieć pierwszy taki obiekt, użyj
detect
.[1, 2, 3, 4, 5, 6, 7].detect{|e| e>3}
daje nam4
.Nie jestem jednak pewien, po co tu się wybierasz.
źródło
Podoba mi się użycie skrótu w jmah do wymuszenia wyjątkowości. Oto kilka innych sposobów na oskórowanie tego kota:
To fajny 1-liniowiec, ale podejrzewam, że może być trochę szybszy:
źródło
Jeśli dobrze rozumiem twoje pytanie, rozwiązałem ten problem, stosując quasi-hackowe podejście do porównywania obiektów Marshaled w celu ustalenia, czy jakiekolwiek atrybuty się różnią. Przykładem może być wstrzyknięcie na końcu następującego kodu:
źródło
Najbardziej elegancki sposób, jaki znalazłem, to spin-off
Array#uniq
z blokiem… Też czyta się lepiej!
źródło
Możesz użyć skrótu, który zawiera tylko jedną wartość dla każdego klucza:
źródło
Użyj Array # uniq z blokiem:
Lub bardziej zwięzłe podejście:
źródło
Railsy mają również
#uniq_by
metodę.Odniesienie: sparametryzowana tablica # uniq (tj. Uniq_by)
źródło
Lubię odpowiedzi jmah i Head. Ale czy zachowują porządek w tablicy? Mogą być w późniejszych wersjach ruby, ponieważ w specyfikacji języka zostały zapisane pewne wymagania dotyczące zachowania kolejności wstawiania skrótów, ale tutaj jest podobne rozwiązanie, którego lubię używać, które zachowuje porządek niezależnie.
źródło
Wdrożenie ActiveSupport:
źródło
Teraz, jeśli możesz sortować według wartości atrybutów, możesz to zrobić:
To dla unikatowego atrybutu 1, ale to samo można zrobić z sortowaniem leksykograficznym ...
źródło