【Rails】ランキング機能を作ってみた【find_each】

最近仕事でランキング機能を作ったのでアウトプットしておこうと思います。

  • rails学習中の人
  • railsを使って仕事をしている人

実装したいこと

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

まずはランキング順に並び替えましょう

@user = User.all.order(rank_point: :desc)

これで上の右側みたいな並び替えられた状態でユーザーを取得できます。

 

次に順位を求めましょう

@ranking = 1
@user.find_each do |user|
  @ranking += 1
  if user.id == current_user.id
   return @ranking
  end
end

 

まずは@rankingの初期値を1にします。

@userをfind_eachで@rankingを +1しながら回してuser.id == current_user.idが一致したときの@rankingを返せばこれがそのユーザーの順位ということになります。

 

これを見たときにeach_wich_indexでいいじゃん!って思った方もいるでしょう

@user.each_with_index do |user, i|
  if user.id == current_user.id
   return i + 1
  end
end

確かにこれでもいいのですがユーザー数が何十万とか何百万とか大量になったときに、メモリに乗りきらずに大変なことになる可能性があります。

詳しくはこの記事を御覧ください。

blog.toshimaru.net

 

ランキング機能をもっといい感じに実装できる方法があったらぜひ教えてください!

ありがとうございました。それではまた。