❤️
Rails ランキング表示
やりたいこと
投稿されたレシピで、いいねの数が多い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の明確な違いが説明できない...
わかるようになったら追記しよう。
参考文献
Discussion