2010-12-20 35 views
2

我已经为客户创建了一个问题,就像StackOverflow一样。我不是想实现某种点数系统(比如SO声望)。我试图通过关联(我认为设置正确)获得了某些记录数。主要是我试图得到用户答案的​​票数。这是一个例子。试图通过多个协会获得计数

/views/questions/show页面我通过调用部分_answer.html.erb列出了该问题的所有答案。每个答案都可以通过简单地做answer.user.username来获取answer.user信息(用户名,电子邮件等)。我想显示一个徽章,如格式一些总点计算。所以如果User A回答了Question A,在User A的回答旁边,我想显示所有User A的回答投票总数。

我能顺利拿到计数为用户解答在/views/answers/_answer.html.erb通过执行以下操作:

<%= answer.user.answers.count %> 

但是当我尝试以扩展语法/协会获得所有投票数User A的答案我得到未定义的方法错误。

<%= answer.user.answers.votes.count %> 

我在这里设置了根本错误还是我错过了一些东西。

这有点让人困惑,所以让我知道你是否需要更多的细节。

UPDATE:

这里有关联:

答案

class Answer < ActivRecord::Base 
    belongs_to :question 
    belongs_to :user 
    has_many :votes, :dependent => :destroy 
end 

投票

class Vote < ActiveRecord::Base 
    belongs_to :answer 
    belongs_to :user 
    belongs_to :question 
end 

用户

class User < ActiveRecord::Base 
    has_many :questions, :dependent => :destroy 
    has_many :answers, :dependent => :destroy 
    has_many :votes, :through => :answers , :dependent => :destroy 
end 

回答

3
<%= answer.user.answers.votes.count %> 

answer.user.answers 

是答案的数组,所以我想你想的东西像

<%= answer.user.answers[id].votes.count %> 

UPDATE

<% answer.user.answers.each do |answer| %> 
    <%= answer.votes.count%> 
<% end% > 

UPDATE

<%= (answer.user.answers.map{|x| x.votes.count}).sum%> 

I LOVE轨这样的事情

+0

我得到一个未定义的方法错误的投票与该行。 – bgadoci 2010-12-20 16:28:15

+0

刚更新了这个问题。 – bgadoci 2010-12-20 16:39:56

+0

我可能应该提到我在Rails 2.3.9中 – bgadoci 2010-12-20 17:00:15

1

但是当我试图扩展该语法/关联以获得所有用户A的答案的票数时,我得到未定义的方法错误。
你可以用user.answers集合in here(除了标准的数组/枚举方法)找到完整的清单。而且它只是收集实例,而不是Answer对象,因此您无法从其上调用Answer模型中的方法。

你可以尝试setupping has_many :votes, :through => :answers的关系。 (See here for details)虽然,我不确定:through是否可以在这种情况下工作。
或者,您可以在User模型建立方法返回所有Vote对象(简单地通过所有答案迭代)

但坦率地说,创建Vote对象的部落只是指望他们听起来像资源的严重浪费我。

+0

那么,你说什么就是答案吗?如果不是创建投票对象,并且不能通过您提到的其他方法完成...我该怎么做? – bgadoci 2010-12-20 17:52:28

+1

我没有说它不能完成。例如,您可以随时将自定义方法添加到“用户”模型中,并将所有内容整合到一个循环中(如他的帖子中提到的** Bohdan Pohorilets **)。但更简单的解决方案只是为了保存数据库中每个用户的声誉值(您可以离开或移除“投票”模型)。然后,当有人投票时,您需要更新它。 – 2010-12-20 18:04:29

+0

因此,它绝对可以用你的方式完成。 – 2010-12-20 18:05:36