今回はいいね順に記事を3つ表示する方法を書いていきたいと思います。
前提
・記事のテーブル名はnotesとする
・いいね機能のテーブル名はlikesとする
・いいね機能は実装しているものとする
・htmlではなくhamlで説明する
コントローラをいじる
@all_ranksを追加してあげてます。
def index
@all_ranks = Note.find(Like.group(:note_id).order('count(note_id) desc').limit(3).pluck(:note_id))
end
これだけで、いいね順に記事をランキング形式で取ってくる事ができます。
今回はindexでやってますが、別に他のアクションでも構いません。あくまで例です!
@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に代入
という感じです!楽勝ですね!
ビューで表示させる
- @all_ranks.each do |note|
#後はご自身で表示させたいカラム名を打ち込むだけ!
たったこれだけです!eachでいいね順に5つの記事がランキングで表示できます!
もし、第1位、2位とか数字を表示させたい時は、with_index(1)を使ってあげてください!
- @all_ranks.each.with_index(1) do |note, i| %>
第
= i
位
= note.title
とりあえず、これで終了です!
番外編〜自分のノートをランキングにしたい時〜
もし、自分のノートのみをランキング表示させたい!となった時には
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の定義をモデルにクラスメソッドとして書いちゃいましょう!
モデルにメソッドを書く
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というクラスメソッドを定義しました!
これをコントローラで使ってあげると、、
def index
@all_ranks = Note.create_all_ranks
end
これでしっかりと取得できているはずです!
コントローラが綺麗になりましたね。
終了!ありがとうございました!
いいねを頂けたらめっちゃ嬉しいです!