Rails向け高機能カウンタキャッシュ gem ‘counter_culture’ README(翻訳)

概要 英語README: magnusvk/counter_culture(MITライセンス) 原文更新日: 2017/04/24 著者: magnusvkほか リポジトリ: https://github.com/magnusvk/counter_culture gemバージョン: 1.7.0 counter_culture README(翻訳) Railsアプリ向けの、ターボの効いたカウンタキャッシュです。Rails標準のカウンタキャッシュと比べて多くの点が改善されています。 カウンタキャッシュの更新を、値の作成や破棄のほか、値の変更時にも行える 「多階層カウンタキャッシュ」をサポート(訳注: リレーション階層が離れていてもカウンタキャッシュの更新を直接指定できる) 動的なカラム名をサポート: オブジェクトの種類ごとにカウンタキャッシュを分離 カウントの他に合計も出せる Ruby 2.2.5と2.3.1、およびRailsの最新パッチリリースである3.2、4.0、4.1、4.2、5.0、5.1でテストされています。 インストール Gemfileにcounter_cultureを追加します。 gem ‘counter_culture’, ‘~> 1.0’ 次にbundle installを実行します。 データベーススキーマ 必要なカラムをすべてのカウンタキャッシュについて作成しなければなりません。counter_cultureのジェネレータで、マイグレーション用のスケルトンを作成できます。 rails generate counter_culture Category products_count 上を実行すると、以下のようなコードを含むマイグレーションが生成されます。 add_column :categories, :products_count, :integer, null: false, default: 0 注意: gemが正常に機能するには、カラムは必ずNOT NULLに設定し、ゼロ値のデフォルトを設定する必要があります。 既存のデータにカウンタキャッシュを追加する場合は、生成されたマイグレーションに手動で値を設定する必要があります。 利用法 シンプルなカウンタキャッシュ class Product < ActiveRecord::Base belongs_to :category counter_culture :category end class Category < ActiveRecord::Base has_many :products end Productモデルにcounter_culture :categoryと書くことで、Categoryモデルのcategoriesテーブルのproducts_countカラムのカウンタキャッシュが最新に保たれます。 多階層カウンタキャッシュ class Product < ActiveRecord::Base belongs_to :sub_category counter_culture [:sub_category, :category] end class SubCategory < ActiveRecord::Base has_many :products belongs_to :category end class Category < ActiveRecord::Base has_many :sub_categories end Productモデルにcounter_culture [:sub_category, :category]と書くことで、リレーション階層が離れたCategoryモデルのcategoriesテーブルのproducts_countのカウンタキャッシュを最新に保ちます。カウントキャッシュを指定できる階層レベル数に制限はありません。 カウンタキャッシュは、リレーションの階層レベルごとに指定する必要があります。上のコード例で、CategoryとSubCategoryのそれぞれにproductのカウントが必要な場合は、Productクラスを次のように変更します。 class Product < ActiveRecord::Base belongs_to :sub_category counter_culture [:sub_category, :category] counter_culture [:sub_category] end カラム名のカスタマイズ class Product < ActiveRecord::Base belongs_to :category counter_culture :category, column_name: “products_counter_cache” end class Category < ActiveRecord::Base has_many :products end Productモデルにcounter_culture :category, column_name: “products_counter_cache”と書くことで、Categoryモデルのcategoriesテーブルのproducts_counter_cacheカラムのカウンタキャッシュが最新に保たれます。カウントキャッシュを指定できる階層レベル数に制限はありません。 動的なカラム名 class Product < ActiveRecord::Base belongs_to :category counter_culture :category, column_name: proc {|model| “#{model.product_type}_count” } # product_type属性は [‘awesome’, ‘sucky’] のいずれか end class Category < ActiveRecord::Base has_many :products end 増分(delta magnitude)の指定 class Product < ActiveRecord::Base belongs_to :category counter_culture :category, column_name: :weight, delta_magnitude: proc { model.product_type == … Continue reading Rails向け高機能カウンタキャッシュ gem ‘counter_culture’ README(翻訳)