You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询无任何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 09:39:20