Используйте плагин vote_fu
. Поддерживаются следующие методы:
user.vote_count # all votes
user.vote_count(true) # votes for
user.vote_count(false) # votes against
posts.votes_count # all vote count
posts.votes_for # votes for
posts.votes_against # votes against
posts.votes_total # votes total
Если вы не хотите использовать плагин, я бы подошел к вашему сценарию следующим образом:
Я предполагаю следующее соотношение между моделями.
class User < ActiveRecord::Base
has_many :posts
has_many :votes, :through => :posts
end
class Post < ActiveRecord::Base
belongs_to :user
has_many :votes
end
class Vote < ActiveRecord::Base
belongs_to :post
end
1.1) Для подсчета всех голосов, отданных за всех пользователей
Vote.count # all
Vote.count(:conditions => {:vote => true}) # all for
Vote.count(:conditions => {:vote => false}) # all against
1.2) Чтобы найти голоса пользователя
user.votes.count # all
user.votes.count(:conditions => {:vote => true}) # all for
user.votes.count(:conditions => {:vote => false}) # all against
2.1) Пользователи с наибольшим количеством голосов «за»
# You can add the limit clause to restrict the rows
User.find(:all, :select => "users.*, count(votes.id) AS count",
:joins => [:posts, :votes],
:conditions => [" votes.vote = ? ", true],
:group => "votes.id", :order => "count DESC")
2.2) Сообщения с наибольшим количеством голосов
# You can add the limit clause to restrict the rows
Post.find(:all, :select => "posts.*, count(votes.id) AS count",
:joins => [:votes],
:conditions => [" votes.vote = ? ", true],
:group => "votes.id", :order => "count DESC")
3.1) За пользователя общее количество голосов
См. 1.2.1