На одном проекте мне понадобилось получать список форматов для баннеров из одной рекламной платформы.
Задача с виду простая, но возникла одна проблема - список форматов приходит не уникальный.
Для решения этой проблемы я решил использовать встроенный в Ruby класс Set и немного DDD.
Итак, по порядку.
Список форматов мы будем получать по API, для этого создадим сервис:
В ответ нам приходит массив примерно следующего вида:
Как видно из примера, форматы в списке повторяются.
Воспользуемся классом Set, чтобы сделать этот список уникальным:
Для удобства работы, обернем каждый формат в отдельную сущность.
Для этого создадим класс BannerFormatEntity:
Теперь обновим наш сервис, чтобы использовать класс BannerFormatEntity.
Так же добавим условие, чтобы в списке были только активные форматы:
Остается последний штрих.
Для того чтобы Set мог определять уникальность наших объектов, необходимо определить в классе BannerFormatEntity 2 метода: Object#eql? и Object#hash.
Вот таким простым и элегантным способом, мы решили нашу задачу с получением уникального списка форматов для баннеров.
Сервис MyTargetService отправляет запрос к API рекламной площадки и возвращает уникальную коллекцию объектов BannerFormatEntity.