Vous faites deux choses :
- Filtrer les utilisateurs avec la requête db au lieu de filtrer dans l'application
-
ne récupère que les champs dont vous avez besoin à partir de la base de données, plutôt que l'ensemble des objets utilisateur (en supposant que vous ayez d'autres éléments dans l'utilisateur, que vous avez omis ici par souci de brièveté)
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 :Vous ne voulez probablement pas utiliser map
sur User.all
, cela nécessitera beaucoup de mémoire si vous avez beaucoup de documents utilisateur lourds. De plus, vous n'utilisez pas les utilisateurs mappés, mais collectez plutôt les résultats dans les competitors
tableau vous-même, donc each
devrait fonctionner correctement.