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)
)