mysql - Rails 计算列与 ID 匹配的行数

标签 mysql ruby-on-rails ruby count

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

但这只是计算每一行,我可以写什么来关联它们?

最佳答案

推荐的方法是在查询中使用分组:

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

关于mysql - Rails 计算列与 ID 匹配的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14265850/

相关文章:

php - 将可变数量的参数传递到 PDO 语句并返回 JSON 对象

MYSQL查询逗号中id相同的记录

java - 尝试将数据库中的信息显示到终端中

ruby-on-rails - 从 Ruby on Rails 调用 PL/pgSQL 存储过程

ruby-on-rails - Rails::Engine 路线未在生产环境中加载

mysql - 如何使用 $this->request->params 从 URL 获取值

ruby-on-rails - 如何使用 mongoid 实现 'social' 方面

ruby-on-rails - 向 ActiveRecord 序列化添加更多属性?

ruby - 融合表 : Why do I keep getting a "400 Bad Request" error when trying to update a table style via Ruby's RestClient gem

mysql - Rails 安装 mysql - 安装 mysql2 : ERROR: Failed to build gem native extension 时出错