Robisz dwie rzeczy:
- Filtruj użytkowników za pomocą zapytania bazy danych zamiast filtrowania w aplikacji
-
pobieraj tylko potrzebne pola z bazy danych, a nie całe obiekty użytkownika (zakładając, że masz inne rzeczy w użytkowniku, które pominąłeś tutaj dla zwięzłości)
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:Prawdopodobnie nie chcesz używać map
na User.all
, będzie wymagało dużo pamięci, jeśli masz dużo ciężkich dokumentów użytkownika. Ponadto nie używasz zmapowanych użytkowników, ale zamiast tego zbierasz wyniki u competitors
tablicę samodzielnie, więc each
powinien działać dobrze.