0

模型是VoteIssueIssue has_many :votes. 具有 STI 列类型,当用户对某个问题进行投票时,该列类型由问题索引上的隐藏表单Vote填充:Upvote或填充。:Downvote如何找到任一类型UpvoteDownvote给定问题的投票数?现在我在Issue模型上使用这样的方法:

 def upvotes_count(issue_id)
     Upvote.count(:conditions => "issue_id = #{issue_id}")
 end

def downvotes_count(issue_id)
      Downvote.count(:conditions => "issue_id = #{issue_id}")
end

当我循环浏览问题索引上的所有问题时,我从视图中传递了 issue_id,如下所示:

issue.upvotes_count(issue.id)

这是正确的还是有更好的方法?当我已经在实例上运行时,我似乎不必传递 id。我在控制台中玩过试图弄清楚但无法弄清楚。我知道@issue.Upvote.count行不通。

4

1 回答 1

0

您有几个选择:在类中定义额外的关联(或方法)Issue,或scopeVote类中使用。这些示例假设 Rails 3,尽管它们可以很容易地针对 Rails 2.3 进行调整。

  1. 中的其他关联Issue

    class Issue < ActiveRecord::Base
    
      has_many :votes
      has_many :upvotes, :class_name => "Vote", :conditions => ['type = ?', 'Upvote']
      has_many :downvotes, :class_name => "Vote", :conditions => ['type = ?', 'Downvote']
    
    end
    

    在这里,我们添加了条件来优化对某个问题的相关投票结果,以便您可以调用issue.upvotesissue.downvotes。在这种情况下,要获得对某个问题的赞成票数是issue.upvotes.count.

  2. 适用范围Vote

    class Vote
    
      scope :up, where(:type => 'Upvote')
      scope :down, where(:type => 'Downvote')
    
    end
    

    Vote 中的upanddown范围提供了关于投票关系的方法,因此您可以调用issue.votes.upand issue.votes.down。要计算对某个问题的赞成票数很简单issue.votes.up.count

于 2012-10-10T03:25:45.557 回答