子テーブルのレコード件数を取る際に使える!counter_culture
投稿に対するコメント数などを取る際に、複雑なSQLを書こうとしていたのですが、 counter cache(カウンターキャッシュ)というものを使えばとてもスマートに各投稿へのコメント数が取得できました。
さすがRails、痒いところに手が届きます!
投稿数が多くなることを考えて、今回はcounter_cultureというgemを使うことにしました。
下記のような親子関係のテーブル(1対多)
親:Question, 子:Answer
ステップは下記
gemを追加
親テーブルにカウント数格納用のカラムを追加
子のモデルに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を書くのに苦労していたのでとても助かりましたε-(´∀`*)ホッ
参照元: