2016-04-14 57 views
3

Saatlik gaz tüketim girişleri olan bir postgresql veritabanına sahibim. Şimdi, her ay için en yüksek tüketimi olan günleri bulmalıyım.Raylar, ActiveRecord ve SubQueries

düz SQL böyle alt sorgular kullanmak:

SELECT 
    DATE_TRUNC('month', day) AS month, 
    MAX(dailyconsumption) as maxconsumption 
FROM (
    SELECT 
     DATE_TRUNC('day', date) AS day, 
     SUM(consumption) AS dailyconsumption 
    FROM Records 
    GROUP BY day 
) t 
GROUP BY month 

Ancak, raylar içinde bunu yapmanın en iyi yolu (veya herhangi bir şekilde) bilmiyorum. Herhangi bir girişi takdir ediyorum. ActiveRecord'u atlamalı mıyım? Performans yüksek bir önceliktir.

Teşekkür ederiz!

cevap

3

Sizin alt sorgu gibi bir şeyle yeniden edilmelidir.

Records.select(...).from(subquery) 

subquery'un ActiveRecord ilişkisi olduğunu unutmayın. Gerçek veri yok. İkinci ifadede SQL'e dönüştürülür ve her şey DB tarafında çalıştırılır.

+0

Teşekkürler! '.From' hakkında bilmiyordum. Bu alt sorguları tanımlamak için en uygun yer neresidir? Kontrol eden, denetleyici? – potofski

+0

@potofski, bunları koymak için "en iyi" olan tartışma konusudur. Güncel Raylar uygulamaları, denetleyiciyi mümkün olduğunca az tutmayı ve modelde çalışma yapmayı önermektedir. – z5h

0

Performans yüksek önceliğe sahipse, bir Görünüm kullanmayı düşünün, bir görünüm normal Model olarak Active Record'da gösterilebilir, Materyalize Edilmiş Görünüm kullanmayı düşünebilir ve kayıtları düzenli aralıklarla güncelleyebilirsiniz, böylece hesaplamaya gerek kalmaz her zaman her şey.

Taşımalarınızın bir parçası olarak görünümler ve görüntülenen görünümler eklemek için scenic gem'a bakın.

subquery = Records 
    .all 
    .select("DATE_TRUNC('day', date) AS day", "SUM(consumption) AS dailyconsumption") 
    .group("day") 

bir tablo yerine, bir alt sorgu sorgulamak için from kullanın: