RailsでSNS系の個人アプリを制作している途中で、1つの投稿に結びついているイイねの合計は簡単に表示できたのですが、ユーザー1人の全ての投稿に結びついているイイねの合計を取得し、表示するのには一工夫必要だったのでその方法をご紹介します。
目次
1. アソシエーションの定義
この機能を実装するにあたって登場するモデルは、下記の3になります。
- Userモデル(ユーザー)
- Postモデル(投稿)
- Likeモデル(イイね)
まずはアソシエーションの定義から。
# user.rb
has_many :posts
has_many :likes
# post.rb
belongs_to :user
has_many :likes
# like.rb
belongs_to :user
belongs_to :post
2. users_controller.rbの編集
次に、users_controllerで「User」に結びつく全ての「Post」を取得していきます。
# paramsに入っている値から、ユーザーを取得し@userに代入する。
@user = User.find(params[:id])
# 取得したユーザーに結びついている全ての投稿を取得し、@user_postsに代入する。
@user_posts = @user.posts
最後に「@user_posts」にeach文を使い、1つの投稿に紐づくイイねを、用意した変数に順番に足していきます。
# 変数を定義し、0を代入。
@likes_count = 0
# countメソッドを使い、1つの投稿に結びつくイイねを予め定義しておいた@likes_countに足していく。
@user_posts.each do |post|
@likes_count += post.likes.count
end
あとはview側で@likes_countを表示してあげれば、イイねの合計数を表示することができます。
まとめ
ユーザーの全ての投稿に紐づくいいねの合計数を表示するには、
- アソシエーションの定義
- 投稿の取得
- each文を使い変数に足していく
この3つの作業が必要です。