読者です 読者をやめる 読者になる 読者になる

Railsで関連レコードの条件付き集計を行う

f:id:technuma:20170203230844p:plain

ブログサービスを作っているときに、1ユーザーあたりの投稿数(公開済み記事のみ)を取得したいというときに便利なgemがあったのでご紹介します!

環境

$ rails -v
Rails 4.2.5

目的

Railsで関連レコードの条件付き集計をしたい。

DB

user と post が1対多の構成です。
(user:1 post:多)

準備

Rails標準の機能の counter_cache は単純な集計しかできないため counter_culture を使います。

github.com

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

書いた人

twitter.com