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 に答える