ruby-on-rails - ActiveRecord Count 用于计算 Rails 中 group by 返回的行数

标签 ruby-on-rails activerecord ruby-on-rails-2

我环顾四周,找不到任何答案。所有答案都涉及到 不是 使用 GROUP BY。

背景:
我有一个分页器,它将为 ActiveRecord.find 提供选项。它添加了一个 :limit 和 :offset 选项并执行查询。我还需要做的是计算记录的总数(减去限制),但有时查询包含一个 :group 选项,并且 ActiveRecord.count 尝试返回 GROUP BY 返回的所有行及其每个计数。我在 Rails 2.3.5 中这样做。

我想要的是 ActiveRecord.count 返回 GROUP BY 返回的行数。

下面是一些示例代码,演示了其中的一个实例(用于查找所有标签并按带有该标签的帖子数量对它们进行排序):

options = { :select => 'tags.*, COUNT(*) AS post_count',
            :joins => 'INNER JOIN posts_tags',   #Join table for 'posts' and 'tags'
            :group => 'tags.id',
            :order => 'post_count DESC' }

@count = Tag.count(options)

options = options.merge { :offset => (page - 1) * per_page, :limit => per_page }

@items = Tag.find(options)

使用 :select 选项,Tag.count 生成以下 SQL:
SELECT count(tags.*, COUNT(*) AS post_count) AS count_tags_all_count_all_as_post_count, tags.id AS tags_id FROM `tags`  INNER JOIN posts_tags  GROUP BY tags.id  ORDER BY COUNT(*) DESC

正如你所看到的,它只是在'tags.*, COUNT(*)' 周围包裹了一个 COUNT(),而 MySQL 提示 COUNT 中的 COUNT。

如果没有 :select 选项,它会生成以下 SQL:
SELECT count(*) AS count_all, tags.id AS tags_id FROM `tags` INNER JOIN posts_tags GROUP BY tags.id ORDER BY COUNT(*)

它返回整个 GROUP BY 结果集而不是行数。

有没有办法解决这个问题,或者我是否必须破解分页器来解释使用 GROUP BYs 的查询(我将如何去做)?

最佳答案

如果您使用的是 Rails 4 或 5,您也可以执行以下操作。

Tag.group(:id).count

关于ruby-on-rails - ActiveRecord Count 用于计算 Rails 中 group by 返回的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5073170/

相关文章:

ruby-on-rails - Rails 委托(delegate)设置值

mysql - 通过关联使用named_scope

ruby-on-rails - Rails HABTM : Post. 仅每个用户的标题唯一性

mysql - 如何在没有关联的情况下选择使用 Active Record 中的联接方法返回的列?

ruby-on-rails - Paypal 与 rails

ruby-on-rails-3 - 销毁与销毁全部

ruby-on-rails - Rails 将参数/参数传递给 ActiveRecord 回调函数

ruby-on-rails - 使用 :before_save 检查 nil 值

javascript - Uncaught ReferenceError : Ajax is not defined onchange issue

ruby-on-rails - 如何在 Rails 中使用 Test::Unit 测试记录器输出?