2

我有 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 和 total。

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

PS:我试图在数据库中为 COUNT(*) 做一个演员,但这没有帮助。我尽量避免做这样的事情:

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

2 回答 2

1

Article.group(:category_id).count可能会给你一些你可以使用的东西。这将返回一个散列,其中每个键代表 category_id,每个值代表对应的整数作为整数。

于 2012-09-07T12:17:54.623 回答
1

不,不支持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 知道它是一个整数类型。

于 2012-09-07T12:20:50.130 回答