Rails,ActiveRecord和SubQueries

时间:2016-04-14 10:06:04

标签: sql ruby-on-rails activerecord subquery rails-postgresql

我有一个postgresql数据库,包含每小时燃气消耗条目。 现在,我需要找到每个月消费量最高的日子。

在纯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

但是,我不知道在rails中执行此操作的最佳方式(或任何方式)。我很感激任何意见。我应该绕过ActiveRecord吗?绩效是一个高度优先事项。

谢谢!

2 个答案:

答案 0 :(得分:3)

您的子查询应该使用以下内容重新创建:

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

要从子查询而不是表中查询,请使用from

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

请注意subquery是ActiveRecord关系。不是实际数据。它在第二个语句中转换为SQL,整个事务在DB端运行。

答案 1 :(得分:0)

如果性能是高优先级然后考虑使用View,视图可以在Active Record中表示为常规模型,您甚至可以考虑使用物化视图并定期更新记录,这样您就不需要每次计算一切。

有关在迁移过程中添加视图和物化视图的信息,请参阅scenic gem