如何查询无任何active状态订阅的用户(Active Record查询)
无有效活跃订阅用户查询实现
关联规则前提
User模型通过has_many关联多个Subscription模型,同一用户最多仅存在1条status为active的订阅记录Subscription模型通过belongs_to关联归属对应的User模型
需求说明
筛选出所有订阅均已取消、即不存在任何active状态订阅的用户,默认包含从未产生过订阅记录的用户
实现方案
Active Record 写法
方案1:左连接写法(性能优,兼容Rails 5+)
通过左连接订阅表,直接过滤掉存在活跃订阅的用户,分组去重即可:
# 若status用整数枚举存储,将'active'替换为对应枚举数值 User.left_outer_joins(:subscriptions) .where.not(subscriptions: { status: 'active' }) .group('users.id')
方案2:NOT EXISTS 写法(语义清晰,全版本兼容)
用子查询判断用户不存在活跃订阅,逻辑直观不容易踩坑:
User.where.not( Subscription.where(status: 'active') .where('subscriptions.user_id = users.id') .arel.exists )
原生SQL参考
对应NOT EXISTS逻辑的原生SQL如下,在subscriptions表为user_id、status字段加了联合索引时查询效率极高:
SELECT users.* FROM users WHERE NOT EXISTS ( SELECT 1 FROM subscriptions WHERE subscriptions.user_id = users.id AND subscriptions.status = 'active' );
补充说明
如果业务需要排除从未产生过订阅的用户,仅筛选「有过订阅记录、当前所有订阅均已取消」的用户,可以追加对应条件:
- Active Record 追加:
.where.not(subscriptions: { id: nil })- 原生SQL 追加:
AND EXISTS (SELECT 1 FROM subscriptions WHERE subscriptions.user_id = users.id)
内容的提问来源于stack exchange,提问作者Malaika Inam
相关产品推荐
相关产品推荐

