Railsで関連レコードの条件付き集計を行う
ブログサービスを作っているときに、1ユーザーあたりの投稿数(公開済み記事のみ)を取得したいというときに便利なgemがあったのでご紹介します!
環境
$ rails -v Rails 4.2.5
目的
Railsで関連レコードの条件付き集計をしたい。
DB
user と post が1対多の構成です。
(user:1 post:多)
準備
Rails標準の機能の counter_cache は単純な集計しかできないため counter_culture を使います。
Gemfileにcounter_cultureを追記してインストール
# Gemfile gem 'counter_culture'
bundle install
実装
is_draft が false かつ is_deleted が false のときにカウントするようにします。
counter_culture :user, column_name: proc { |model| (!model.is_draft && !model.is_deleted) ? 'posts_count' : nil }, column_names: { ["posts.is_draft= ? AND posts.is_deleted= ?", false, false] => 'posts_count', }
column_name
は databaseにCOMMITがあったとき、
column_names
は データ初期化するときに呼ばれます。
データ初期化
bin/rails c
にて下記コマンドを実行
Post.counter_culture_fix_counts