ruby-on-rails - 在 Rails 3 中使用 group by 查询中以整数形式获取 COUNT(column)

标签 ruby-on-rails ruby-on-rails-3 activerecord

我有 2 个模型类别和相关文章,如下所示:

class Category < ActiveRecord::Base
  has_many :articles
end

class Article < ActiveRecord::Base
  belongs_to :category

  def self.count_articles_per_category
    select('category_id, COUNT(*) AS total').group(:category_id)
  end
end

我正在像这样访问 count_articles_per_category

Article.count_articles_per_category

这将返回包含 2 列的文章:category_id 和总计。

我的问题是总列是一个字符串。所以问题是:是否有一种方法可以将该列作为整数获取?

PS:我尝试在数据库中对 COUNT(*) 进行转换,但这没有帮助。 我尽量避免做这样的事情:

articles = Article.count_articles_per_category
articles.map do |article|
  article.total = article.total.to_i
  article
end 

最佳答案

不,ActiveRecord 不支持自动转换数据类型(始终作为字符串传输到数据库)。

ActiveRecord 检索项目时的工作方式是:

  • 对于 ActiveRecord 模型中的每个属性,检查列类型,并将数据转换为该类型。
  • 对于额外的列,它不知道应该将其转换为什么数据类型。

额外列包括其他表或表达式中的列。


您可以使用不同的查询,例如:

Article.group(:category_id).count
Article.count(:group => :category_id)

它们返回 :category_id => count 的哈希值。因此,您可能会得到类似 {6=>2, 4=>2, 5=>1, 2=>1, 9=>1, 1=>1, 3=>1} 的内容。

使用 count 方法是有效的,因为它隐式地让 ActiveRecord 知道它是整数类型。

关于ruby-on-rails - 在 Rails 3 中使用 group by 查询中以整数形式获取 COUNT(column),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12317850/

相关文章:

ruby-on-rails - 使用 SQL 条件 IN 时 ActiveRecord 查找器中的奇怪行为

rspec - 在rSpec和Rails3中 stub 设计

ruby-on-rails - 基于枚举值的自定义顺序

sql - 使用 Activerecord 中的两个属性创建 IN 语句

ruby-on-rails - ruby rails : Save objects and attributes of model to another table

ruby-on-rails - 如何只有 :include based on a conditional statement

javascript - rails : How to confirm email address entered in text box matches current user's email address?

javascript - rails : Include External JavaScript

ruby-on-rails - Rails View Helper 是如何工作的

ruby-on-rails-3 - Rails 3.2 + Devise 2.1 + OmniAuth + Backbone.js 身份验证