[英]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.