あなたは2つのことをします:
- アプリケーションでフィルタリングする代わりに、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
正常に動作するはずです。