2010-01-07 14 views
37

Wiem, że już to widziałem, ale nie mogę teraz znaleźć niczego. Chcę pogrupować zapytanie według określonej kolumny i być w stanie wyświetlić liczbę osób w każdej grupie. Mam pierwszą część w dół:Grupa i liczba w szynach

@line_items = @project.line_items.all(:group => "device_id") 

Jest to widok indeksu elementu zamówienia, który jest po prostu tabelą wyświetlającą elementy zamówienia. Jak utworzyć kolumnę w tej tabeli dla "licznika" teraz, gdy elementy zamówienia są zgrupowane według urządzenia?

Odpowiedz

75

Możesz zrobić count na line_items, który zwróci Ci zamówiony hash z device_id i count.

@project.line_items.group(:device_id).count 
+1

Daje to ostrzeżenie: "OSTRZEŻENIE ODNIESIENIA: Relacja # obliczenia z opcjami szukacza jest przestarzała. Utwórz zakres, a następnie zadzwoń do obliczenia na nim. (wywołane z C: w 'count') '' – Chloe

+6

@Chloe - Spróbuj tego w Rails 4, aby usunąć ostrzeżenie: '@ project.line_items.group (: device_id) .count' –

8

Wystarczy dodać :select opcję:

@line_items = @project.line_items.all(
    :group => "device_id", 
    :select => "device_id, COUNT(*) as count" 
) 

Następnie każdy @line_item będzie mieć atrybut count.

+0

HRM, kładę debugowania (@line_items) moim zdaniem, ale nie widzę żadnych liczy, więc don” Myślę, że cię rozumiem. Myślę, że dane wyjściowe są dokładnie takie same, jak bez opcji wyboru. – tladuke

+0

to faktycznie działa, ale nie, jeśli masz: include – tladuke

+0

Metoda debugowania nie pokaże liczby, ponieważ nie jest atrybutem ActiveRecord, ale tam * znajduje się * atrybut count na każdym obiekcie. W każdym razie rozwiązanie Chandry jest znacznie lepsze. –

10

hash devise_id jako klucz i powiązane rekordy liczyć

@project.line_items.group(:devise_id).count 
3

coś

User.all(:joins => :comments, :select => "users.*, count(comments.id) as comments_count", :group => "users.id") 

może również pracować ...

0

tylko dla liczyć zrywać byłoby szybciej tutaj zamiast grupy

@project.line_items.pluck(:device_id).count 


@project.line_items.pluck(:device_id).uniq.count 
+0

Zwrócą zupełnie różne wyniki dla wyliczonych atrybutów . Np 'customer_subscriptions.group (: status) .count' powróci: '{1 => 6, 2 => 11, 3 => 136: 0 => 30}' i 'customer_subscriptions. pluck (: status) .count' po prostu zwróci '183' – msdundar

+0

true, a co powiesz na uniq? @ project.line_items.pluck (: device_id) .uniq.count –

0

Myślę, że można spróbować także.

@project.line_items.group(:device_id).pluck("device_id, count(device_id)") 

^^ Daje tablicy tablic z 'device_id i liczbę' elementów