ruby on railsで関連レコードを集計する

目的

例えば、以下の場合

models/Album.rb

has_many: pictures

models/Picture.rb

belogns_to: albums

Album.pictures_countでAlbumの持つPictureを取得できるようにする。

Gem

gem 'counter_culture'

モデルの構造

アルバムが複数の写真を持つイメージ

# vi app/models/album.rb

class Album < ActiveRecord::Base
  has_many :pictures, :dependent => :destroy
end

# vi app/models/picture.rb

class Picture < ActiveRecord::Base
  belongs_to :album
  counter_culture :album
end

カラムの追加

# rails g counter_culture Album pictures_count
# rake db:migrate RAILS_ENV=production

既存の状態を反映

# rails c -e production  # 例ではproduction環境
# irb(main):001:0> Picture.counter_culture_fix_counts

確認

# irb(main):002:0> Album.first.pictures_count
=> 4

ここで、Album.first.pictures.countで出力される結果と同じならOK

また、中間テーブルがある場合は、中間テーブルのモデルに以下のように記述する。

class RoutePicture < ActiveRecord::Base
  belongs_to :route
  belongs_to :picture

  counter_culture :route, column_name: "pictures_count"
end

参考

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

http://wonderwall.hatenablog.com/entry/2015/08/16/225116