概要
ユーザー情報に紐づいた都道府県訪問数をランキング形式でビュー画面で表示する方法。
環境
- 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位のようなランキング順位をビュー画面で表示することができる。