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