Kasperi
Kasperi

Reputation: 863

Get likes.size of all posts by user

Ok, <%= @post.likes.size %> is easy. But how to get likes of all posts created by user? <%= @user.posts.likes.size %> throws:

undefined method `likes' for #<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Post:0x69c9198>

models/user.rb

has_many :likes, foreign_key: "liker_id", dependent: :destroy
has_many :liked_posts, through: :likes, source: :liked

models/post.rb

has_many :likes, foreign_key: "liked_id", dependent: :destroy
has_many :liker_users, through: :likes, source: :liker

models/like.rb

belongs_to :liker, class_name: "User"
belongs_to :liked, class_name: "Post", :counter_cache => :likes_count
validates :liker_id, presence: true
validates :liked_id, presence: true

Note, with the above models <%= @user.likes.size %> returns how many posts this user has liked, not the size of likes on his posts.

Upvotes: 0

Views: 202

Answers (3)

Phlip
Phlip

Reputation: 5343

In addition to the low-level answers, the high level answer is...

User.has_many :posts
Post.has_many :likes
User.has_many :likes, through: :posts

That way, a mere @user.likes.count will add up a single user's entire fan club.

The low-level answers are good to know, and illustrate useful techniques. This answer is "better" insofar as it's DRY, and it minimizes <% code %> in the view. That's kind'a important!

Upvotes: 0

Jon
Jon

Reputation: 10898

This should do it:

@user.posts.joins(:likes).count

Upvotes: 1

usha
usha

Reputation: 29349

Post.joins(:likes).where("likes.user_id = ?", user.id).count

Upvotes: 0

Related Questions