#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
Будет выдавать заказы с истекшим сроком действия, у которых все подписки с истекшим сроком действия