LoginSignup
24
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-06-06

私的メモ

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)を使うと便利
ruby:rank.html.erb
<% @rank.each.with_index(1) do |rank, i| %>
<%= "第#{i}位" %>
<%= rank.title %>
<% end %>

24
16
1

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
24
16