[英]Query object including aggregate count data
我正在尝试为管理员建立一些基本的表格,以查看用户,他们邀请了多少用户以及其中有多少用户为订阅付费。 纤细的桌子看起来像这样:
User: id, email
Referral: id, inviter_id <- (maps to user_id), paid_at (date, is either nil or set)
我遇到的问题是,我需要先汇总数据,然后进行排序,然后再进行分页,然后再将集合返回到视图。 如果可能的话,我想拥有完整的用户对象,尽管如果可能的话,我只会解决我需要的字段。
我一直在尝试重做以下内容:
User.joins(:referrals).group('users.id').count('referrals.id')
这给我返回了{ id: count }
的哈希值。 当paid_at IS NOT NULL
时,我还如何获得结果,甚至将它们作为键值对获得? 我一直在尝试加入,但对于如何正确执行操作感到迷茫,我们将不胜感激。
编辑:
我也尝试过以下查询:
User.joins(:referrals).select('users.id, users.email, count(referrals.id)').group('users.id, users.email')
但是,我假设它仅返回id和email,因为ActiveRecord模型没有用于Referrals_count的字段。
编辑:添加了SQL
SELECT
users.id,
users.email,
COUNT(DISTINCT(r1.id)) AS referrals_count,
COUNT(DISTINCT(r2.id)) AS paid_referrals_count
FROM
users
LEFT JOIN
referrals AS r1 ON users.id = r1.inviter_id AND
r1.accept_at IS NOT NULL
LEFT JOIN
referrals AS r2 ON r1.id = r2.id AND
r2.paid_at IS NOT NULL
GROUP BY
users.id, users.email
ORDER BY
paid_referrals_count
我不确定上面的sql是否有效,这是我试图获取的数据的第一步。
“我假设是因为ActiveRecord模型没有用于Referrals_count的字段。” 你是对的。 在您的选择中使用AS paid_referrals_count
。
User.joins(:referrals).select('users.id, users.email, count(referrals.id) AS paid_referrals_count').group('users.id, users.email')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.