Как мне сопоставить два массива с дубликатами в Ruby? - PullRequest
4 голосов
/ 18 марта 2011

Я знаю, что это удаляет дубликаты:

@email.distributions.map(&:zip_code) & CardSignup.all.map(&:zip_code)

Но я хочу сделать то же самое, где я нахожу все, что соответствует, но оно также показывает мне дубликаты.

Есть идеи?

Я пытаюсь найти количество людей, которые подписались на карточку, у которой почтовый индекс совпадает с предпочтением почтового индекса, которое я разместил.

1 Ответ

7 голосов
/ 18 марта 2011

Array#reject снова на помощь! Как и Array#map, он принимает блоки, что позволяет вам делать что-то вроде этого:

zip_codes = CardSignup.all.map(&:zip_code)
@email.distributions.reject{|o| !zip_codes.include?(o.zip_code)}

О, но, конечно, если вам нравится находить более изящные способы, всегда рассматривайте операторов, как вы уже делали. & вернет новый массив с объектами, которые находятся в обоих, | объединит и удалит дубликаты.

ruby-1.9.2-p0 > [1,2] | [2,3]
 => [1, 2, 3] 
ruby-1.9.2-p0 > [1,2] & [2,3]
 => [2] 

Редактировать: как сказал Токланд в комментариях, поскольку это применяется к модели Rails, вы можете рассмотреть возможность сделать это как выбор. Как это -

zip_codes = CardSignup.all.map(&:zip_code)
@email.distributions.where('zip_code IN (?)', zip_codes)

Или сделайте это с ВНУТРЕННИМ СОЕДИНЕНИЕМ. Хотя выглядит не так красиво.

@email.distributions.joins('INNER JOIN card_signups ON card_signups.zip_code = email_distributions.zip_code').all

(Если таблица для @ email.distributions - это email_distributions ..)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...