На самом деле это очень простой алгоритм (по крайней мере, для разумного числа пользователей и групп).
Рассмотрим каждого пользователя как набор, элементами которого являются группы, членом которых он является. Чтобы найти группы, общие для двух пользователей, просто пересечь наборы членства этих двух пользователей.
Итак, если Лицо А находится в группе K, M и N, а Лицо B находится в K, N и P, у вас будут следующие наборы:
A := {K, M, N}
B := {K, N, P}
intersect(A, B) = {K, N}
В Ruby вы можете использовать стандартный библиотечный класс Set
для выполнения этих вычислений:
require 'set'
memberships_a = Set[:K, :M, :N]
memberships_b = Set[:K, :N, :P]
shared = memberships_a.intersection(memberships_b)
# you can also use the '&' operator as shorthand for 'intersection'
shared_2 = memberships_a & memberships_b