Você faz duas coisas:
- Filtrar os usuários com consulta db em vez de filtrar no aplicativo
-
apenas busque os campos que você precisa do db, em vez de todos os objetos do usuário (supondo que você tenha outras coisas no usuário, que você omitiu aqui por brevidade)
Competitor = Struct.new(:html_url, :description, :user) competitors = [] User.where('watchlists.tags_array' => %w[ruby web framework]). only(:nickname, :watchlists).each do |u| u.watchlists.where(:tags_array => %w[ruby web framework]).each do |wl| competitors << Competitor.new(wl.html_url, wl.description, u.nickname) end end
PS:Provavelmente você não quer usar
map
em User.all
, exigirá muita memória se você tiver muitos documentos de usuário pesados. Além disso, você não está usando os usuários mapeados, mas coletando resultados nos competitors
array você mesmo, então each
deve funcionar muito bem.