Пусть tag_ids
- это массив идентификаторов A и B:
tag_ids = [a.id, b.id]
Затем вам нужно найти клиентов, у которых есть тег A или B:
except_relation = Customer.
joins(:tags).
where(tags: { id: tag_ids }).
distinct
Иисключите их из тех, у которых есть хотя бы один тег:
Customer.
joins(:tags).
where.not(id: except_relation).
distinct
INNER JOIN
, созданный .joins
, удаляет Customer без тега и является источником ошибок, поэтому необходим distinct
.
UPD : когда вам нужна производительность, вам, вероятно, придется изменить схему БД, чтобы избежать дополнительных объединений и индексов.Вы можете искать примеры реализации тегов jsonb
.