❤️

Rails ランキング表示

2023/08/04に公開

やりたいこと

投稿されたレシピで、いいねの数が多い1位〜3位を表示させたい。

訂正前

@recipes = Recipe.includes(:favorited_customers)
           .sort_by { |recipe| -recipe.favorited_customers.size }
           .take(3)

【どこがまずいのか?】
全てのレシピのいいねをしたユーザーの数をRubyで並び替えている。レシピの件数が数万件あると数万件を1件ずつ[いいねの数]を比較しているため、サーバーにかなりの不可になる。

訂正後

@recipes = Recipe.left_joins(:favorites)
          .group(:id).order("count(favorites.recipe_id) desc")
	  .limit(3)

【解説】
left_joins:結合したテーブルから指定したモデルのデータのみ取得するメソッド
group(:id):指定したカラムのレコードの種類ごとにデータをまとめるメソッド
order("count(favorites.recipe_id) desc"):データベースから取得してきた値を並び替えることができるメソッド


データベースにて、recipesテーブルとfavoritesテーブルをアソシエーションをもとに1つのテーブルとみなし、recipe.id別のfavoritesの数でソートし、上位3件をデータベースは返す。


takeとlimitの明確な違いが説明できない...
わかるようになったら追記しよう。

参考文献

https://pikawaka.com/rails/left_joins
https://pikawaka.com/rails/group
https://pikawaka.com/rails/order
https://zenn.dev/sn_fk_popo/articles/e3bd3cb7d512b4

Discussion