Ik denk dat je al die groeps-ID's kunt krijgen van de gebruikersgroepen waarvan het geslacht van de gebruiker female
is en gebruik ze met een NOT IN
clausule, om al die groepen uit te filteren die overeenkomen met die id's:
with users(id, gender) as (values (1, 'male'), (2, 'female')),
groups(id, name) as (values (1, '1st'), (2, '2nd')),
user_groups(id, user_id, group_id) as (values (1, 1, 1), (2, 2, 1), (3, 2, 1))
select *
from groups g
where g.id not in (
select ug.group_id
from user_groups ug
inner join users u on u.id = ug.user_id
where u.gender = 'female'
)
De ActiveRecord-versie kan er als volgt uitzien:
Group.where.not(
id: UserGroup.joins(:user)
.where(users: { gender: 'female' })
.select(:group_id)
)