Bạn làm hai điều:
- Lọc người dùng bằng truy vấn db thay vì lọc trong ứng dụng
-
chỉ tìm nạp các trường bạn cần từ db, thay vì toàn bộ đối tượng người dùng (giả sử bạn có một số nội dung khác trong người dùng, mà bạn đã bỏ qua ở đây cho ngắn gọn)
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
Tái bút:Có thể bạn không muốn sử dụng map trên User.all , nó sẽ yêu cầu nhiều bộ nhớ nếu bạn có nhiều tài liệu người dùng nặng. Ngoài ra, bạn không sử dụng người dùng được ánh xạ mà thay vào đó thu thập kết quả trong competitors tự mảng, vì vậy each sẽ hoạt động tốt.