2

我有一个 Postgres 表,其中用户可以有许多支付订阅,并且支付订阅是活动的或非活动的,这通过支付订阅表上的 activate_at 和 inactivated_at 日期字段显示。我现在想找到所有没有有效支付订阅的用户。

无需任何付费订阅即可轻松找到所有用户

User.joins("LEFT JOIN payment_subscriptions ON (payment_subscriptions.user_id = users.id)").where("payment_subscriptions.id IS NULL")

我还想找到所有只有非活动订阅的用户。如果我使用与上面相同的模式,我会发现所有用户在某个时候都取消了他们的订阅,但不能保证他们也没有活跃的订阅。

User.joins("LEFT JOIN payment_subscriptions ON (payment_subscriptions.user_id = users.id)").where("payment_subscriptions.inactivated_at IS NOT NULL")

如何从我的表中获取没有订阅或没有活动订阅的用户?

4

2 回答 2

2

这个为您提供没有任何有效订阅的用户。

User.joins("LEFT JOIN payment_subscriptions on (payment_subscriptions.user_id = users.id and payment_subscriptions.inactivated_at is null)").where("payment_subscriptions.id is null")

如果您只想获得那些不活跃的人,也可以使用您之前的加入

我不知道在rails中是否可行,但您也可以使用not exists语法:

User.where('
    not exists (
         select *
         from payment_subscriptions as ps
         where ps.user_id = users.id and ps.inactivated_at is not null
    )
')
于 2013-08-23T12:54:09.507 回答
0

您没有提供太多关于如何实际定义用户当前是否没有付款订阅的信息,但据我推断,您需要检查 payment_subscriptions.inactivated_at 是否为 null 并且 payment_subscriptions.id 也为 null。

User.joins("LEFT JOIN payment_subscriptions ON (payment_subscriptions.user_id = users.id)").where("payment_subscriptions.inactivated_at IS NOT NULL AND payment_subscriptions.id IS NULL")
于 2013-08-23T12:56:36.207 回答