Kaorina’s diary

Ruby on Railsとかとか

子テーブルのレコード件数を取る際に使える!counter_culture

投稿に対するコメント数などを取る際に、複雑なSQLを書こうとしていたのですが、 counter cache(カウンターキャッシュ)というものを使えばとてもスマートに各投稿へのコメント数が取得できました。

さすがRails、痒いところに手が届きます!

投稿数が多くなることを考えて、今回はcounter_cultureというgemを使うことにしました。

下記のような親子関係のテーブル(1対多)

親:Question, 子:Answer


ステップは下記

  1. gemを追加

  2. 親テーブルにカウント数格納用のカラムを追加

  3. 子のモデルにcounter_cultureの記述を追記


1. gemを追加

gem 'counter_culture'

2. 親テーブルにカウント数格納用のカラムを追加

ジェネレーターを使う場合

$ rails generate counter_culture Question answers_count

Migrationファイルを使い、下記のようなカラム追加でもいけます
add_column :questions, :answers_count, :integer, null: false, default: 0


3. 子モデルにcounter_cultureの記述を追加

app/models/questions.rb

class Question < ApplicationRecord
  has_many :answers
end


app/models/answers.rb

class Answer < ApplicationRecord
  belongs_to :question
  counter_culture :question, column_name: 'answers_count'  #任意のカラム名を付ける場合のみcolumn_nameが必要
end


Viewでは他の値と同様に下記のように呼び出せます。

<% @questions.each do |question| %>
  <%= question.title %>
  <%= question.answers_count %>
<% end %>

LEFT OUTER JOINとGROUP BYを使ったSQLを書くのに苦労していたのでとても助かりましたε-(´∀`*)ホッ

参照元

関連レコード数の集計(カウンターキャッシュ) - Qiita