【Rails】ランキング機能を作ってみた【find_each】
最近仕事でランキング機能を作ったのでアウトプットしておこうと思います。
実装したいこと
Userモデルにinteger型のlevelというカラムがあって、levelが高い順にユーザーを並びかえてランキング順に表示したい
Userモデル
id level id level
1 100 4 500
2 400 → 2 400
3 200 5 300
4 500 3 200
5 300 1 100
これを こうしたい
Controller
まずはランキング順に並び替えましょう
これで上の右側みたいな並び替えられた状態でユーザーを取得できます。
次に順位を求めましょう
まずは@rankingの初期値を1にします。
@userをfind_eachで@rankingを +1しながら回してuser.id == current_user.idが一致したときの@rankingを返せばこれがそのユーザーの順位ということになります。
これを見たときにeach_wich_indexでいいじゃん!って思った方もいるでしょう
確かにこれでもいいのですがユーザー数が何十万とか何百万とか大量になったときに、メモリに乗りきらずに大変なことになる可能性があります。
詳しくはこの記事を御覧ください。
ランキング機能をもっといい感じに実装できる方法があったらぜひ教えてください!
ありがとうございました。それではまた。