我试图为管理员构建一个基本的表格来查看用户,他们邀请了多少用户以及这些用户中有多少人为他们的订阅付费。细长的桌子看起来像这样:
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和电子邮件,我假设因为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是否有效,这是我试图获取的数据的第一次传递。
答案 0 :(得分:1)
“我假设因为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')