Rails、ActiveRecord 和子查询

Rails, ActiveRecord and SubQueries

我有一个包含每小时 gas 消耗条目的 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 吗?性能是重中之重。

谢谢!

如果性能是高优先级,那么考虑使用视图,视图可以在活动记录中表示为常规模型,你甚至可以考虑使用物化视图并定期更新记录,这样你就不需要每次都计算所有内容。

请参阅 scenic gem 了解如何在迁移过程中添加视图和具体化视图。

您的子查询应该用类似的东西重新创建:

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

要从子查询中查询,而不是 table,您可以使用 from

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

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