Děláte dvě věci:
- Filtrujte uživatele pomocí dotazu db namísto filtrování v aplikaci
-
načítat pouze pole, která potřebujete z db, spíše než celé uživatelské objekty (za předpokladu, že máte v user nějaké další věci, které jste zde pro stručnost vynechali)
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:Pravděpodobně nechcete použít map
na User.all
, bude to vyžadovat hodně paměti, pokud máte hodně těžkých uživatelských dokumentů. Také nepoužíváte namapované uživatele, ale místo toho shromažďujete výsledky v competitors
pole sami, takže each
by mělo fungovat dobře.