40
46

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 2020-08-20

今回はいいね数の多い順(いいね数が0も含む)に投稿を表示させるランキング機能の実装方法についてです。
ランキング機能の実装方法は他でもあったのですが、いいねが0の投稿も表示させている記事が見当たらなかったので実装してみました。

前提

  • 投稿のテーブルは posts、 ユーザーのテーブルは users とする。
  • いいね機能に必要な中間テーブルは likes とする。
  • postsuserslikes それぞれのテーブルはいずれも作成済みとする。

手順

モデルにアソシエーションを定義

post.rb
class Post < ApplicationRecord
    belongs_to :user
    has_many :likes, dependent: :destroy
    has_many :liked_users, through: :likes, source: :user
end
user.rb
class User < ApplicationRecord
  has_many :posts,dependent: :destroy
  has_many :likes, dependent: :destroy
  has_many :liked_posts, through: :likes, source: :post
end
like.rb
class Like < ApplicationRecord
  belongs_to :post
  belongs_to :user
end

コントローラーをいじる

app/controller/posts_controller.rb
def index
  @posts = Post.includes(:liked_users).sort {|a,b| b.liked_users.size <=> a.liked_users.size}
end

ここでは sort というrubyのメソッドを使って順序を操作している。
=> sortに関してはこちらを参照

a.liked_users.sizeb.liked_users.size が表しているのはそれぞれ各投稿のいいね数。
すなわち、各投稿のいいね数を比較して昇順で並び替えている。

ビューで表示させる

あとはビューで表示させるだけ。

app/view/posts/index.html
<% @posts.each do |post| %>

  #省略

<% end %>

まだまだ知らないメソッドたちはたくさんあるなぁ。

参考

40
46
0

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
40
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?