[英]Rails STI. How do I count the number of votes of type Upvote or Downvote for associated model?
模型是Vote
和Issue
。 Issue has_many :votes
。 Vote
具有一个STI列类型,当用户对某个问题进行投票时,该列会以“问题”索引上的隐藏形式填充:Upvote
或:Downvote
。 如何找到给定问题的Upvote
或Downvote
类型的票数? 现在,我正在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
当我循环浏览Issues索引上的所有问题时,我从视图中传递了issue_id,如下所示:
issue.upvotes_count(issue.id)
这是对的还是有更好的方法? 似乎我已经在实例上进行操作时,似乎不必传递ID。 我在控制台中玩过,试图找出答案,但无法弄清楚。 我知道@issue.Upvote.count
不起作用。
您有两个选择:在Issue
类中定义其他关联(或方法),或在Vote
类中使用scope
。 这些示例假设使用Rails 3,尽管可以轻松地针对Rails 2.3进行调整。
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.upvotes
和issue.downvotes
。 在这种情况下,要获得对事件的赞成票数,就是issue.upvotes.count
。
Vote
范围:
class Vote scope :up, where(:type => 'Upvote') scope :down, where(:type => 'Downvote') end
投票中的up
和down
作用域提供了有关投票关系的方法,因此您可以调用issue.votes.up
和issue.votes.down
。 要获得对某个问题的支持票数,只需issue.votes.up.count
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.