【问题标题】:Rails, ActiveRecord and SubQueriesRails、ActiveRecord 和子查询
【发布时间】:2016-04-14 10:06:04
【问题描述】:

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

    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 端运行。

    【讨论】:

    • 谢谢!我不知道'.from'。定义这些子查询的最佳位置在哪里?控制器?
    • @potofski 把它们放在哪里“最好”还有待商榷。当前的 Rails 实践建议尽量减少控制器并在模型中工作。
    【解决方案2】:

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

    请参阅scenic gem,了解在迁移过程中添加视图和物化视图。

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      • 1970-01-01
      相关资源
      最近更新 更多