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 ..)