【问题标题】:How do I iterate through Associations in Rails?如何遍历 Rails 中的关联?
【发布时间】:2012-05-28 22:46:18
【问题描述】:

好的,所以我有一个评论模型和一个投票模型(通过单个变量“喜欢”建模的 Upvotes 和 Downvotes,如果它为 true,则为 upvote,如果为 false,则为 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

现在这很好,我可以赞成、反对和删除选票。但我正在尝试根据赞成票和反对票(现在只是赞成票-反对票)生成一个分数。 为此,我在评论模型中添加了以下内容

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 作为答案。错误在循环中,因为我可以将 up 或 down 变量设置为它之外的任何内容并且它们被传递。它开始让我发疯,我不知道我哪里出错了。

【问题讨论】:

  • 评论模型与用户/投票的关系是什么?
  • 关系是has_many :votes, dependent: :destroy 在用户模型中还有创建和销毁投票的方法,检查他们的用户是否为评论投票,并检查他们的投票方式(使用upvote? 和 downvote? 投票方法)

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


【解决方案1】:

对于初学者来说,最好使用数据库来计算具有命名范围的反对和赞成的数量。

然后,一旦获得总计数,您就可以从赞成票中减去反对票。

有关范围的更多信息,请参阅:http://guides.rubyonrails.org/active_record_querying.html#scopes

【讨论】:

    【解决方案2】:

    如果您确定错误在循环中,那么这是我的最佳猜测:

    你有 v.upvote 吗?好像,和 v.downvote?作为一个 elsif。

    如果这两个都是假的会发生什么?我很确定什么都不会发生。因此,0 - 0 = 0,你总是得到零。如果您的 v.upvote?和 v.downvote?写得正确,或者它们是正确的开始值。

    试试:

    if v.upvote?
     ...
    else
     ...
    end
    

    显然,您以这种方式进行这些设置是有原因的,但您可能只是专注于错误的事情。

    希望这会有所帮助。

    【讨论】:

    • 啊,我没想到,但是在这种情况下,我知道它们是正确的(我将它们设置在数据库中进行测试)。并且在决定为赞成/反对票显示哪个部分时使用它们。我认为它是循环,因为如果我在每个循环上添加变量(不在 if 块内),它们仍然返回 0。这对我说 self.votes.each 没有像我预期的那样工作
    • 一种测试它的方法是按照最初的方式设置循环,除了在顶部添加一个变量:counter = 0 然后在循环中添加一个 else 并在 else 块中增加计数器.然后在循环之后执行 logger.debug(counter) 以查看循环迭代了多少次而不触及上下。在循环内部但在 if 块外部使用 logger.debug 验证您想知道的其他内容,以确定每次迭代的 v 是什么。我相当肯定你已经完全按照你应该的方式编写了循环。发生了一些奇怪的事情。
    • 哦,太好了,我不知道 logger.debug!谢谢,我相信我现在就试试看!希望完全有帮助:D
    • 我发现了错误!由于某种原因,votable_type 没有被正确设置,所以在执行 self.votes 时它没有找到任何投票。哦!感谢本的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2019-12-05
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多