2014-11-26 19 views
8

İki tablo var içinde KontRaylar ActiveRecord Group, Sum gerçekleştirin ve bir sorguda

Order (ID, Value) 

ve

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

Ben her tür (sayım) siparişlerin toplam sayısını almak istiyorum ve Ben, bu almak

tipine göre bu emirleri toplam değeri (toplam) ayrı ayrı

Order.group(:order_type).count(:id) 
kullanılarak

ve

Order.group(:order_type).sum(:value) 
aşağıdaki SQL, tek sorguda eşdeğer bunlar gerçekleştirmek istiyoruz

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 
I adını görüntülemek böylece sorgu da tam OrderType nesne döndürmesi gerekir

benim görünüm

cevap

9

ActiveRecord, aynı sorguda birden çok toplama işlevini desteklemediğinden, bunu başarmak için biraz ham SQL yapmanız gerekir.

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

Burada dikkat edilmesi gereken nokta size toplu sütunları için takma ad olarak OrderType varolan bir sütun kullanmak gerekir olmasıdır. Burada OrderType nesnesini de alacaksınız.

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

sonucu erişmek için
İlgili konular