Rails tips: ActiveRecord count系機能の基本と応用(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

Rails tips: ActiveRecord count系機能の基本と応用(翻訳)

Active Recordには、データベース内にあるものを数えるシンプルかつパワフルなメソッド群が用意されています。管理職の好きそうな機能ですね。最もシンプルなメソッドはcountsizeです。

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をご自由にダウンロードいただけます。

関連記事

Rails: データベースのパフォーマンスを損なう3つの書き方(翻訳)

Rails向け高機能カウンタキャッシュ gem ‘counter_culture’ README(翻訳)

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

開発
Ruby 2.7.0-preview2がリリース

2019年10月23日

夏のTechRachoフェア2019

週刊Railsウォッチ

インフラ

ActiveSupport探訪シリーズ