Как исключить строки, которые соответствуют критериям, основанным на значении одной строки в activerecord?

#ruby-on-rails #activerecord

#ruby-on-rails #activerecord

Вопрос:

Я использую ActiveAdmin и имею эту область, которая показывает заказы с истекающими подписками:

 scope: expired do |orders|
  orders
    .joins(:subscriptions)
    .group('orders.id')
    .having('MIN(subscriptions.end_date) < ?', Time.now.end_of_day)
  

И у меня есть настройка заказов, где у них может быть несколько подписок, поэтому, если срок действия одной подписки истек, а другой нет, то в этой области все равно будет отображаться этот заказ.

Итак, в этом случае у меня есть что-то вроде набора результатов, подобных этому, который возвращает что-то вроде этого:

введите описание изображения здесь

и скажем, дата 24.02.19, я хотел бы иметь возможность исключить все строки с идентификатором 14010497, поскольку не у всех подписок истек срок действия. Как бы я сделал это в activerecord? Я попытался использовать NOT IN вот так:

where('orders.id NOT IN (SELECT DISTINCT id from distributions WHERE distributions.end_date < ?)' но я думаю, что я неправильно использую in.

Ответ №1:

Попробуй,

 scope: expired do |orders|
  orders
    .joins(:subscriptions)
    .group('orders.id')
    .where('subscription.end_date < ?', Time.now.end_of_day)
    .having('count(subscriptions.id) = ?', 0)
end
  

Будет выдавать заказы с истекшим сроком действия, у которых все подписки с истекшим сроком действия