0

所以我有一个帖子模型和投票模型,其中投票通过 post_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 %>

但这只是计算每一行,我能写什么让它们相关联?

4

1 回答 1

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 模式。

于 2013-01-10T19:38:26.557 回答