好的,所以我有一个评论模型和一个投票模型(Upvotes和Downvotes通过单个变量'喜欢'建模,如果真的它是一个upvote,如果它是假的它是一个downvote。)。投票是一个has_many关系,并且是多态的(我希望能够在以后的评论中使用它)。
所以在评论模型中有行
has_many :votes, :as => :votable
投票模型定义如下
class Vote < ActiveRecord::Base
belongs_to :votable, :polymorphic => true
belongs_to :user
def upvote?
like
end
def downvote?
!like
end
end
现在这很好,我可以投票,投票和删除选票就好了。但是我试图根据upvotes和downvotes产生一个得分(现在简单的upvotes-downvotes)。 为此,我将以下内容添加到评论模型
def score
up = 0
down = 0
self.votes.each do |v|
if v.upvote?
up += 1
elsif v.downvote?
down += 1
end
end
up-down
end
然而,我总是得到0回答作为答案。错误在循环中,因为我可以将向上或向下变量设置为外部变量并且它们被传递。它开始让我疯了,我不知道我哪里出错了。
答案 0 :(得分:1)
对于初学者来说,最好使用数据库来计算具有命名范围的down和upvotes的数量。
然后,一旦获得总计数,就可以从upvotes中减去downvotes。
有关范围的更多信息,请参阅:http://guides.rubyonrails.org/active_record_querying.html#scopes
答案 1 :(得分:0)
如果您确定错误在循环中,那么这是我最好的猜测:
你有v.upvote吗?作为if和v.downvote?作为一个elsif。如果这两个都是假的,会发生什么?我很确定什么都不会发生。因此,0 - 0 = 0,你总是回零。如果你的v.upvote,循环是完全正常的?和v.downvote?写得正确,或者它们是正确的值。
尝试:
if v.upvote?
...
else
...
end
显然,出于某种原因,你以这种方式进行了这些设置,但是你可能只是在错误地进行分区。
希望这有帮助。