Reputation: 863
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
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