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.