acts_as_votable rails计算特定用户发出的答案的投票数

时间:2014-01-25 03:24:02

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

我接近Ruby on Rails的新手(但是喜欢它),我无法管理过滤。

Mi的目标是检索由一个用户创建的答案上的所有投票。我正在使用act_as_votable_gem

在answer.rb上我有:

class Answer < ActiveRecord::Base
  acts_as_votable    
  belongs_to :user
  belongs_to :letter
  ...
end

在user.rb我有:

class User < ActiveRecord::Base
  acts_as_voter 
  has_many :answers, dependent: :destroy
  ...
end

在users_controller.rb出现这个伎俩,因为我在用户show action上有字母表格:

def show
  @user = User.find(params[:id])  
  @letter = Letter.new(params[:letter])   
  @letters = @user.letters.all
  @answers = @user.answers
  ...
  @emitedupvotes = @user.votes.up.count
  @emiteddownvotes = @user.votes.down.count
  @totalemitedvotes = @emitedupvotes + @emiteddownvotes
  @receivedupvotes = ????????
  @receiveddownvotes = ???????
  ...
end

我试过了:

a)(推荐的)@receivedupvotes = @ answer.votes.up.count但是这个需要@answer = Answer.find(params [:id])并且我有=&gt; &#34; ActiveRecord :: RecordNotFound at / users / 1无法找到id = 1&#34;

的答案

或者,如果我这样做:Answer.find(params [:answer_id])=&gt; &#34;找不到没有ID的答案&#34;。

b)(最合乎逻辑的)@receivedupvotes = @ answers.votes.up.count =&gt; &#34;未定义的方法`投票&#39;为零:NilClass&#34;

c)(疯狂的)@receivedupvotes = @ answers.user.votes.up.count =&gt; &#34;未定义的方法`user&#39;&#34;

d)@receivedupvotes = @ answers.votes.up.where(&#34; voter = @ user&#34;)。count =&gt; &#34;未定义的方法`投票&#39;为零:NilClass&#34;。

所以,我尝试了连接(以前从未做过):

e)@receivedupvotes = @ answers.joins(:votes).votes.up.count =&gt; &#34;未定义的方法`投票&#39;为...&#34;

f)@receivedupvotes = @ answers.joins(:votes).up.count =&gt; &#34;未定义的方法`up&#39;为...&#34;

有任何帮助吗?感谢。

2 个答案:

答案 0 :(得分:0)

我不知道你是否仍然坚持这个,但如果是这样的话......

投票什么?似乎答案得到了投票。

如果用户has_many:answers,则表示@ user.answers将返回一个Answer对象数组。但是,根据你的观点判断b)看起来@answers是零,所以你必须深入了解它以找出原因。

所以让@ user.answers返回一个实际的Answer数组而不是nil是你的第一步。

一旦你走到那么远,@ answers.votes将无法工作,因为@answers是一个数组。每个答案都有投票,因此您可以在答案实例上进行投票,而不是在阵列上。

回到您的主要目标,即计算用户收到的所有上下投票。由于用户没有投票,但回答确实已经投票,你需要为每个用户的答案计算所有投票。

这是一种方式:

@receivedupvotes = 0
@receiveddownvotes = 0
@user.answers.each do |answer|
    @receivedupvotes = @receivedupvotes + answer.votes.up
    @receiveddownvotes = @receiveddownvotes + answer.votes.down
end

此外,您应该在变量名中使用下划线,例如@received_up_votes。这是Ruby的推荐方式,更具可读性。

答案 1 :(得分:0)

杰夫。非常感谢你。它现在正在运作。

这是其他人阅读的答案:

@ user.answers正在按预期工作。

这是使用act_as_votable计算用户答案投票的工作实现:

@user_answers_received_upvotes = 0
@user_answers_received_downvotes = 0
@user.answers.each do |answer|
    @user_answers_received_upvotes = @user_answers_received_upvotes + answer.votes.up.size
    @user_answers_received_downvotes = @user_answers_received_downvotes + answer.votes.down.size
end           
@user_answers_total_received_votes = @user_answers_received_upvotes + @user_answers_received_downvotes

我会尽可能地回答你的答案。

再次感谢。