3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】ランキング機能の実装

Posted at

概要

ユーザー情報に紐づいた都道府県訪問数をランキング形式でビュー画面で表示する方法。

環境

  • Rails 6.0.6.1
  • ruby 2.6.5

前提

  • ユーザーのテーブル名:users
  • 都道府県のテーブル名:prefectures
    (Activehashは使用していない。)
  • 中間テーブル名:user_prefectures

コントローラー

ユーザー情報に紐づいた都道府県訪問数をランキング形式で取得し@user_prefecture_ranks変数に代入する。

users_controller.rb
  def ranking
    @user_prefecture_ranks= User.find(UserPrefecture.group(:user_id).order('count(prefecture_id) desc').limit(10).pluck(:user_id))
  end

@user_prefecture_ranksの詳細が下記の通りになります。

@user_prefecture_ranks詳細
UserPrefecture.group(:user_id) #ユーザー情報(:user_id)が同じものにグループ分けをする
order('count(prefecture_id) desc') #都道府県訪問数(:prefecture_id)が多い順に並べる
limit(10) #ビュー画面に表示する最大数を10と設定
pluck(:user_id) #ユーザー情報(:user_id)のみを数字で取り出す。

User.find()#上記pluckで取り出された数字をUserのidとすることで訪問数順にユーザー情報を取得する。

@user_prefecture_ranks

ビュー

ranking.html.erb
<table>
  <tr>
    <th>ランク</th>
    <th>ユーザー名</th>
    <th>訪問数</th>
  </tr>
  <% @user_prefecture_ranks.each.with_index(1) do |rank, i| %> 
  <% if i == 1 %> # iの値が1-3の時はランキング順位の横に王冠のアイコンを表示させる為、if文で条件分岐を記述。
  <tr>
    <td><%= image_tag("gold_icon.png") %><%= i %>位</td>
    <td><%= rank.name %></td>
    <td><%= rank.prefectures.count %></td> 
  </tr>
  <% elsif i == 2 %>
  <tr>
    <td><%= image_tag("silver_icon.png") %><%= i %>位</td>
    <td><%= rank.name %></td>
    <td><%= rank.prefectures.count %></td> 
  </tr>
  <% elsif i == 3 %>
  <tr>
    <td><%= image_tag("blonze_icon.png") %><%= i %>位</td>
    <td><%= rank.name %></td>
    <td><%= rank.prefectures.count %></td> 
  </tr>
  <% else %> 
  <tr>
    <td><%= i %>位</td>
    <td><%= rank.name %></td>
    <td><%= rank.prefectures.count %></td> 
  </tr>
  <% end %>
  <% end %>
</table>

with_index(1)を使うことで、ユーザー情報に紐づいた都道府県訪問数を上から順に表示するだけでなく、1位、2位、3位のようなランキング順位をビュー画面で表示することができる。

ブラウザ例

Image from Gyazo

参考文献

Railsのアソシエーションされたモデルを使ってランキングシステムを作る

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?