Mam już działające rozwiązanie, ale naprawdę chciałbym wiedzieć, dlaczego to nie działa:
ratings = Model.select(:rating).uniq
ratings.each { |r| puts r.rating }
Wybiera, ale nie drukuje unikalnych wartości, drukuje wszystkie wartości, w tym duplikaty. I to jest w dokumentacji: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields
ruby-on-rails
activerecord
alexandrecosta
źródło
źródło
Odpowiedzi:
Wynikiem tego jest zbiór
Model
obiektów. Nie zwykłe oceny. I zuniq
punktu widzenia są one zupełnie inne. Możesz użyć tego:lub ten (najbardziej wydajny)
Aktualizacja
Najwyraźniej od wersji 5.0.0.1 działa tylko na zapytania „najwyższego poziomu”, jak wyżej. Nie działa na serwerach proxy kolekcji (na przykład relacje „has_many”).
W takim przypadku deduplikuj po zapytaniu
źródło
Model.uniq.pluck(:rating)
jest to najbardziej efektywny sposób na zrobienie tego - generuje to SQL, który używaSELECT DISTINCT
zamiast stosować się.uniq
do tablicyModel.uniq.pluck(:rating)
będzieModel.distinct.pluck(:rating)
Model.related_records.group(:some_column).pluck(:some_column)
Jeśli zamierzasz użyć
Model.select
, równie dobrze możesz po prostu użyćDISTINCT
, ponieważ zwróci tylko unikalne wartości. Jest to lepsze, ponieważ oznacza, że zwraca mniej wierszy i powinno być nieco szybsze niż zwracanie pewnej liczby wierszy, a następnie nakazanie Railsom wybrania unikalnych wartości.Oczywiście pod warunkiem, że baza danych rozpoznaje
DISTINCT
słowo kluczowe, a większość powinna.źródło
Model.select("DISTINCT rating").map(&:rating)
aby uzyskać tablicę samych ocen.To też działa.
źródło
pluck
jest czystą metodą Rails> 3.2, która nie jest zależna od Ruby 1.9.x Patrz apidock.com/rails/v3.2.1/ActiveRecord/Calculations/pluckJeśli chcesz również wybrać dodatkowe pola:
źródło
select extra fields
<3 <3Ma to tę zaletę, że nie używa ciągów SQL i nie tworzy modeli
źródło
Ten kod działa jako „DISTINCT” (nie jako Array # uniq) od szyn 3.2
źródło
źródło
.pluck(:rating)
na końcu sprawi, że będzie to dokładnie to, o co poprosił PO.Jeśli idę od razu, to:
Bieżące zapytanie
zwraca tablicę obiektów i napisałeś zapytanie
uniq jest stosowany na tablicy obiektów, a każdy obiekt ma unikalny identyfikator. uniq poprawnie wykonuje swoje zadanie, ponieważ każdy obiekt w tablicy jest uniq.
Istnieje wiele sposobów na wybranie odrębnej oceny:
lub
lub
lub
Jeszcze jedno, pierwsze i drugie zapytanie: znajdź różne dane według zapytania SQL.
Zapytania te będą traktowane jako „londyn”, a „londyn” to samo oznacza, że zaniedbają spację, dlatego wybiorą „londyn” jeden raz w wyniku zapytania.
Trzecie i czwarte zapytanie:
znajdź dane według zapytania SQL i dla różnych danych zastosuj ruby uniq mehtod. zapytania te uznają „londyn” i „londyn” za różne, dlatego w wynikach wyszukiwania wybiorą „londyn” i „londyn”.
prosimy o dołączenie obrazka dla lepszego zrozumienia i obejrzenie „Toured / Oczekuje na zapytanie ofertowe”.
źródło
map
&collect
są aliasami dla tej samej metody, nie ma potrzeby podawania przykładów dla obu.Niektóre odpowiedzi nie biorą pod uwagę, że OP chce tablicy wartości
Inne odpowiedzi nie działają dobrze, jeśli Twój model ma tysiące rekordów
To powiedziawszy, myślę, że dobrą odpowiedzią jest:
Ponieważ najpierw wygenerujesz tablicę Modelu (ze zmniejszonym rozmiarem ze względu na wybór), a następnie wyodrębnisz jedyny atrybut, który mają te wybrane modele (oceny)
źródło
To znaczy, jeśli ktoś szuka tego samego w Mongoid
źródło
Innym sposobem na zebranie kolumn uniq z sql:
źródło