193
185

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 3 years have passed since last update.

Railsでお手軽ランキング機能

Last updated at Posted at 2018-12-26

今回はいいね順に記事を3つ表示する方法を書いていきたいと思います。

前提

・記事のテーブル名はnotesとする
・いいね機能のテーブル名はlikesとする
・いいね機能は実装しているものとする
・htmlではなくhamlで説明する

コントローラをいじる

@all_ranksを追加してあげてます。

app/controller/notes_controller.rb
  def index
    @all_ranks = Note.find(Like.group(:note_id).order('count(note_id) desc').limit(3).pluck(:note_id))
  end

これだけで、いいね順に記事をランキング形式で取ってくる事ができます。

今回はindexでやってますが、別に他のアクションでも構いません。あくまで例です!

@all_ranksの説明をします。

@all_ranksの説明

Like.group(:note_id)#まず、記事の番号(note_id)が同じものにグループを分ける
order('count(note_id) desc')#それを、番号の多い順に並び替える
limit(3)#表示する最大数を3個に指定する
pluck(:note_id)#そして最後に:note_idカラムのみを数字で取り出すように指定。


Note.find()#最終的に、pluckで取り出される数字をノートのIDとすることでいいね順にnoteを取得する事ができる

@all_ranks = Note.find()#最後に@all_ranksに代入

という感じです!楽勝ですね!

ビューで表示させる

app/view/notes/index.html.haml

- @all_ranks.each do |note|
#後はご自身で表示させたいカラム名を打ち込むだけ!

たったこれだけです!eachでいいね順に5つの記事がランキングで表示できます!

もし、第1位、2位とか数字を表示させたい時は、with_index(1)を使ってあげてください!
rank.html.erb
- @all_ranks.each.with_index(1) do |note, i| %>
    第
    = i
    位
  = note.title

とりあえず、これで終了です!

番外編〜自分のノートをランキングにしたい時〜

もし、自分のノートのみをランキング表示させたい!となった時には

app/controller/notes_controller.rb
  def index
    @all_ranks = Note.find(Like.group(:note_id).order('count(note_id) desc').limit(3).pluck(:note_id))
    @my_ranks = @all_ranks.select{ |note| note.user_id == current_user.id }
  end

@my_ranksを追加してあげてください。

@all_ranksは配列になっています。
なのでselectメソッドを使うことにより、user_idがcurrent_userのidじゃないやつは弾いています!
これで自分の記事のみをランキング表示できます!

さらに補足〜コントローラを綺麗にしたい上級者向け〜

今のコントローラの@all_ranksの定義はめちゃくちゃ冗長ですし、本来コントローラはデータを用意するためにあるものです。
もっと良いRailsの使い方があるので、@all_ranksの定義をモデルにクラスメソッドとして書いちゃいましょう!

モデルにメソッドを書く

note.rb
  def self.create_all_ranks #Noteクラスからデータを取ってくる処理なのでクラスメソッド!
    Note.find(Like.group(:note_id).order('count(note_id) desc').limit(3).pluck(:note_id))
  end

create_all_ranksというクラスメソッドを定義しました!
これをコントローラで使ってあげると、、

app/controller/notes_controller.rb
def index
  @all_ranks = Note.create_all_ranks
end

これでしっかりと取得できているはずです!
コントローラが綺麗になりましたね。

終了!ありがとうございました!

いいねを頂けたらめっちゃ嬉しいです!

193
185
2

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
193
185

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?