2013-01-10 86 views
0

因此,我有一個帖子模型和投票模型,其中投票與post_id相關聯。Rails計數列匹配的行數ID

帖子型號

class Post < ActiveRecord::Base 
    attr_accessible :comment_count, :downvote, :id, :text, :title, :upvote, :url, :user_id, :users_voted_up_by, :users_voted_down_by 

    serialize :users_voted_up_by 
    serialize :users_voted_down_by 

    belongs_to :user 

    has_many :votes 
end 

投票型號

class Vote < ActiveRecord::Base 
    attr_accessible :direction, :post_id, :type, :voter_id 

    belongs_to :user 

    belongs_to :post 

    belongs_to :comment 
end 

我需要查詢數據庫中Votes表在我的循環後的當前post_id所有行:

<% @posts.each do |post| %> 
    <%= Vote.count(:post_id, params[:post_id]) %> 
<% end %> 

但這只是統計每一行,我可以寫什麼以便它們相關聯?

回答

3

推薦的做法是在查詢中使用分組:

<% vote_counts = Vote.group(:post_id). 
     where(:post_id => @posts.map(&:id)).count %> 
<% @posts.each do |post| %> 
    <%= post.id %>: <%= vote_counts[post.id] || 0 %> 
<% end %> 

的優勢發揮到分組查詢的是,它僅訪問數據庫一次。如果你喜歡得到每個崗位的一些深不可測的原因,單數,您可以簡單地使用:

<% @posts.each do |post| %> 
    <%= post.id: %> <%= post.votes.count %> 
<% end %> 

不要讓第二個方法的簡單愚弄你,雖然。由於它涉及N + 1模式,因此要求麻煩。

+0

謝謝!爲了快速和徹底的反應! – alt

+0

等,post.votes.count如何工作!?我不在郵寄表中存儲投票! – alt

+1

它通過您在'Post'模型中設置的'has_many:votes'關聯進行工作。 ActiveRecord可以根據此查詢與該帖子相關的投票。 – PinnyM

相關問題