Rails 4 ActiveRecord查询需求:按日期汇总Subscription Versions的MRR总和
嘿,我来帮你搞定这个MRR汇总查询!
首先,你的核心需求是按日期分组,汇总所有订阅版本的MRR总和——从示例来看,就是把每个日期下所有订阅的对应版本MRR加总,对吧?
那咱们来完善你的ActiveRecord查询:
基础版查询(同时获取日期与对应总MRR)
# 执行后会得到包含日期和总MRR的结果集 summary = @subscriptions.joins(:subscription_versions) .group('subscription_versions.date') .select('subscription_versions.date, SUM(subscription_versions.mrr) AS total_mrr') .order('subscription_versions.date')
每一条结果都会包含date(日期)和total_mrr(当日总MRR)两个字段,方便你后续展示或处理。
直接获取纯总和数组(匹配你的示例结果)
如果你只需要像示例那样的纯数值数组([200, 400, 1200]),可以用pluck简化查询:
mrr_totals = @subscriptions.joins(:subscription_versions) .group('subscription_versions.date') .order('subscription_versions.date') .pluck('SUM(subscription_versions.mrr)')
pluck会直接提取SUM计算后的数值,按日期排序后就是你想要的结果。
几个关键注意事项
- 表名/字段名校验:确保你的子表确实是
subscription_versions(符合Rails单数父表名+后缀的惯例),如果实际表名是subscriptions_versions(复数父表名),记得把查询里的表名替换成对应名称。 - 日期类型适配:如果
date字段是datetime类型(包含时分秒),你需要按纯日期分组(避免同一日期不同时间被拆分),以PostgreSQL为例,修改后的查询如下:
MySQL环境可以用mrr_totals = @subscriptions.joins(:subscription_versions) .group('DATE(subscription_versions.date)') .order('DATE(subscription_versions.date)') .pluck('SUM(subscription_versions.mrr)')DATE(subscription_versions.date)或DATE_FORMAT(subscription_versions.date, '%Y-%m-%d')替代。 - 包含无版本的订阅:如果需要统计那些还没有版本的订阅(MRR按0计算),可以把
joins换成left_outer_joins,并用COALESCE把空值转为0:mrr_totals = @subscriptions.left_outer_joins(:subscription_versions) .group('subscription_versions.date') .order('subscription_versions.date') .pluck('COALESCE(SUM(subscription_versions.mrr), 0)')
这样应该就能完美匹配你的需求啦!
内容的提问来源于stack exchange,提问作者Dmitry Gusev
相关产品推荐
相关产品推荐

