私的メモ
Noteに関連付けされているLikeがあり、Like数が多いノートをランキング表示する。
#モデル
User
Note
Like: belongs_to :user note_id:integer
likeテーブルには、note_idカラムとuser_idカラムがあります
likeをすると、note_idとuser_idをデータベースに記録する
likes_controller.rb
like = current_user.likes.build(note_id: note.id)
like.save
#コントローラー
notes_controller.rb
def rank
@rank = Note.find(Like.group(:note_id).order('count(note_id) desc').limit(5).pluck(:note_id))
end
とする。
中身は
notes_controller.rb
group(:note_id)#で、ノートの番号が同じものにグループを分ける
order('count(note_id) desc')#で、番号の多い順に並び替える
limit(5)#で、表示する最大数を指定して
pluck(:note_id)#で:note_idカラムのみを取り出すように指定。
Note.find(integer)#最終的に、取り出される数値オブジェクトをノートのIDとすることで表示される
#ヴュー
あとは、@rank
をeachで表示させるだけ。
rank.html.erb
<% @rank.each do |rank| %>
<%= rank.title %>
<% end %>
TIPS:
もし、第1位!とか表示させたいときは、with_index(1)
を使うと便利
rank.html.erb
<% @rank.each.with_index(1) do |rank, i| %>
<%= "第#{i}位" %>
<%= rank.title %>
<% end %>