多对多

时间:2011-05-03 14:52:36

标签: ruby-on-rails ruby-on-rails-3 activerecord

User.rb
has_many :votes
has_many :photos


Photo.rb
has_many :votes
belongs_to :user

Vote.rb
belongs_to :user
belongs_to :photo

我想列出投票的用户。但是此列表必须包含有关用户投票的次数的信息。例如,当我去url photos / 5 / statistics时必须有如下列表:

1) User1   voted 30 times
2) User432 voted 15 times
3) User43  voted 12 times

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

使用group_by是一种方法

例如:

Photo.first.votes.group_by(&:user).each do |user, votes| 
  puts "User #{user.id} voted #{votes.count} times"
end

答案 1 :(得分:1)

所以基本上,你是在Photo模型中运作的:

class Photo < ActiveRecord::Base
  ...
  def voting_list
    votes.joins(:user).group(:user).count
  end
  ...

这将为您提供如下的OrderedHash:

{<user_object_1> => 14, <user_object_2> => 33, ...}

答案 2 :(得分:0)

如果您想知道单个用户为特定照片投票的次数,您可以执行以下操作:

user = User.find_by_some_option
photo = user.photos.first
photo.votes.find{|vote| vote.user == user}.count