我接近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;
有任何帮助吗?感谢。
答案 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
我会尽可能地回答你的答案。
再次感谢。