概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Ruby on Rails / ActiveRecord - basic and advanced counting
- 原文公開日: 2018/01/15
- 著者: Paweł Dąbrowsk
Rails tips: ActiveRecord count系機能の基本と応用(翻訳)
Active Recordには、データベース内にあるものを数えるシンプルかつパワフルなメソッド群が用意されています。管理職の好きそうな機能ですね。最もシンプルなメソッドはcount
やsize
です。
User.count
User.where(first_name: "Nick").count
訳注:
count
はコストが高くなります。「データベースのパフォーマンスを損なう3つの書き方」も合わせてご覧下さい。
平均値
指定したカラムの平均値を算出するのも非常に簡単です。average
メソッドを呼び出してカラムを指定するだけでできます。
User.average(:salary)
User.where(first_name: "Nick").average(:salary)
合計値
salary
を合計するのに全ユーザーで足し算を繰り返す必要はありません。sum
メソッドにカラムを指定すれば、データベースレベルで合計値を得られます。
User.sum(:salary)
User.where(first_name: "Nick").sum(:salary)
最大値
salary
の最大値が欲しい場合、sarary
のorder byを取って先頭のユーザーを取り出す必要はありません。maximum
メソッドでできます。
User.maximum(:salary)
User.where(first_name: "Nick").maximum(:salary)
最小値
salary
の最小値も同様にminimum
メソッドで取れます。
User.minimum(:salary)
User.where(first_name: "Nick").minimum(:salary)
グループ化
少し複雑な操作もやってみましょう。以下のメソッドを使えばグループ化を簡単に行なえます。以下はオブジェクトのコレクションではなくハッシュを返します。
User.group("users.location").average(:salary)
上のコードは、location
ごとのsalary
の平均値を含むハッシュを生成します。便利ですね。
関連付けを数える
関連付けのカウントはたまに問題になることがあるようです。user
ごとにcomment
が複数ある場合、次の方法でuser
ごとのcomment
数を得られます。
User.joins(:comments).group("users.name").count("comments.id")
こんなに簡単にできました。
お知らせ: コードを正しくテストするには
コードを正しくテストするのは何かと困難であり、しかも最も大変なのはテストを書き始めるときです。テストを書き始めるときに役立つRSpec & Test Driven Developmentの無料ebookをご自由にダウンロードいただけます。