2016-04-14 16 views
3

私は毎時のガス消費量のあるpostgresqlデータベースを持っています。 今、毎月の消費量が最も多い日を探す必要があります。Rails、ActiveRecord、SubQueries

プレーンSQLで私はこのようなサブクエリを使用したい:

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 

は、しかし、私はレールでこれを行うための最善の方法(または任意の方法)を知りません。私は入力を感謝します。 ActiveRecordをバイパスすべきですか?パフォーマンスが最優先です。

ありがとうございました!

答えて

3

あなたのサブクエリのようなもので再作成する必要があります:あなたはfromを使用し、代わりにテーブルの、サブクエリから照会するには

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

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

subqueryはActiveRecordの関係であることに注意してください。実際のデータではありません。 2番目のステートメントでSQLに変換され、DB側ですべてが実行されます。

+0

ありがとうございました!私は '.from'について知らなかった。これらのサブクエリを定義する場所はどこですか?コントローラー? – potofski

+0

@potofskiどこにそれらを置くための "最高"は議論のためです。現行のRailsでは、コントローラーを可能な限り最小限に抑え、モデルで作業を行うことを推奨しています。 – z5h

0

パフォーマンスが高い優先度である場合は、ビューを使用することを検討して、ビューは通常のモデルとアクティブレコードで表すことができ、あなたもマテリアライズド・ビューの使用を検討し、定期的にレコードを更新することができ、あなたは計算する必要がありません。そのように一回一回。

移行の一部としてビューとマテリアライズド・ビューを追加する場合は、scenic gemを参照してください。