2014-11-26 5 views
8

Ich habe zwei Tabellen,Rails Active Perform Group, Sum und Count in einer Abfrage

Order (ID, Value) 

und

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

Ich möchte die Gesamtzahl der Aufträge in jeder Art erhalten (count) und der Gesamtwert dieser Aufträge pro Typ (Summe)

ich einzeln bekommen können diese mit

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

und

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

Ich mag diese würden in einer Abfrage, die gleichbedeutend mit der folgenden 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 

Die Abfrage auch die volle OrderType Objekt zurückgeben sollte auszuführen, damit ich in den Namen angezeigt werden kann Meine Ansicht

Antwort

9

Da ActiveRecord mehrere Aggregationsfunktionen in derselben Abfrage nicht unterstützt, müssen Sie ein wenig Roh-SQL ausführen, um dies zu erreichen.

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') 

Der Punkt hier zu beachten ist, dass Sie eine vorhandene Spalte in Auftragsart als Alias ​​für Ihre aggregierte Spalten verwenden müssen. Hier erhalten Sie auch das OrderType-Objekt.

Um das Ergebnis zu gelangen:

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