Скоупи - це маленькі шмаочки запиту, що можуть бути потім перевикористані. А цей запит зараз здоровенний)
Так що краще залишити `with_matched_field` і додати новий: `with_roles`.
Також `(roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)` не місце в скоупі і це повторення коду з  `roles=`. Так що краще це винести, наприклад в метод классу `User.roles_to_i` і використати в обох методах.