2014-11-26 14 views
8

Ho due tabelle,Rails ActiveRecord Perform Group, Somma e Conte in una query

Order (ID, Value) 

e

OrderType (ID, Name [Quote, Sale, Purchase, etc]) 

voglio ottenere il numero totale di ordini ogni tipo (contare) e il valore totale di tali ordini per tipo di (somma)

posso ottenere questi utilizzando singolarmente

Order.group(:order_type).count(:id) 

e

Order.group(:order_type).sum(:value) 

desidero eseguire queste in una query, l'equivalente alla seguente SQL

SELECT 
    order_types.id, Count(*) as total_count, Sum(orders.value) As total_value 
FROM 
    order 
JOIN 
    order_types ON orders.order_type_id = order_types.ID 
GROUP BY 
    order_types.id 

La query dovrebbe restituire l'intero OrderType oggetto così posso visualizzare il nome my view

risposta

9

Poiché ActiveRecord non supporta più funzioni di aggregazione nella stessa query, è necessario eseguire un po 'di SQL non elaborato per ottenere ciò.

grouped_sales = OrderType 
    .select('order_types.id, order_types.name, 
    sum(orders.value) as sale, count(*) as purchase') 
    .join('JOIN orders ON orders.order_type_id = order_types.id') 
    .group('order_types.id') 

Il punto da notare qui è che è necessario utilizzare una colonna esistente nella OrderType come alias per le colonne aggregate. Qui otterrai anche l'oggetto OrderType.

accedere al risultato:

id -> grouped_sales.first.id 
name -> grouped_sales.first.name 
total orders -> grouped_sales.first.sale 
order value -> grouped_sales.first.purchase