Правите две неща:
- Филтрирайте потребителите с db заявка вместо филтриране в приложението
-
извличане само на полета, от които се нуждаете, от db, а не на целите потребителски обекти (ако приемем, че имате някои други неща в потребител, които сте пропуснали тук за краткост)
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:Вероятно не искате да използвате map
на User.all
, това ще изисква много памет, ако имате много тежки потребителски документи. Освен това не използвате картографираните потребители, а вместо това събирате резултати в competitors
масив себе си, така че each
трябва да работи добре.