Rails,ActiveRecord和子查询

3
我有一个记录每小时燃气消耗量的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个回答

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 语句,并在数据库上运行。

谢谢!我不知道 '.from'。定义这些子查询的最佳位置在哪里?控制器? - potofski
@potofski,“最佳”放置它们的位置是有争议的。当前的Rails实践建议尽可能保持控制器的最小化,并在模型中进行工作。 - Mark Bolusmjak

0
如果性能是高优先级,则考虑使用视图(View)。视图可以在Active Record中表示为常规模型(Model),您甚至可以考虑使用材料化视图(Materialized View)并定期更新记录,这样您就不需要每次都计算所有内容。请参见 scenic gem,以将视图和材料化视图添加为迁移的一部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接