如何遍历Rails中的关联?

时间:2012-05-28 22:46:19

标签: ruby-on-rails ruby-on-rails-3 associations iteration

好的,所以我有一个评论模型和一个投票模型(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回答作为答案。错误在循环中,因为我可以将向上或向下变量设置为外部变量并且它们被传递。它开始让我疯了,我不知道我哪里出错了。

2 个答案:

答案 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

显然,出于某种原因,你以这种方式进行了这些设置,但是你可能只是在错误地进行分区。

希望这有帮助。