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

これは、category_idとtotalの2つの列を持つ記事を返します。

私の問題は、合計列が文字列であるということです。したがって、問題は、その列を整数としてフェッチする方法はありますか?

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 に答える