0

ページの読み込みごとに、これらのリクエストがいくつかあります。

SELECT COUNT(*) FROM `impressions` WHERE `impressions`.`impressionable_id` IN (229) AND `impressions`.`impressionable_type` = 'Document' AND (YEAR(created_at) = 2013 && MONTH(created_at) = 8 && DAY(created_at) = 12)
SELECT COUNT(*) FROM `impressions` WHERE `impressions`.`impressionable_id` IN (229) AND `impressions`.`impressionable_type` = 'Document' AND (YEAR(created_at) = 2013 && MONTH(created_at) = 8 && DAY(created_at) = 13)
SELECT COUNT(*) FROM `impressions` WHERE `impressions`.`impressionable_id` IN (229) AND `impressions`.`impressionable_type` = 'Document' AND (YEAR(created_at) = 2013 && MONTH(created_at) = 8 && DAY(created_at) = 14)
SELECT COUNT(*) FROM `impressions` WHERE `impressions`.`impressionable_id` IN (229) AND `impressions`.`impressionable_type` = 'Document' AND (YEAR(created_at) = 2013 && MONTH(created_at) = 8 && DAY(created_at) = 15)

サーバーの負荷を減らしたいので解決策に変えようとしていcounter_cacheます。私が数えようとしている複雑な関係のために、それを設計するのに少し助けが必要です. カウントを取得するクエリは次のとおりです。

Impression.where(:impressionable_id => component.publications.where(:document_id => document).first.id).count

counter_cache柱はどこに置けばいいですか?また、移行をどのように記述すればよいですか? Componentとを通じて関係にDocumentあります。has_manyPublications

4

1 に答える 1

1

インプレッション数が であり、インプレッション数が日ごとにグループ化されると仮定Publicationします。

PublicationImpression1 日ごとのインプレッションのカウンターとして機能するモデルを作成できますPublication

class CreatePublicationImpressions < ActiveRecord::Migration
  def self.up
    create_table :publication_impressions, :id => false do |t|
      t.integer :impressions, :default => 0
      t.datetime :date
      t.references :publication

      t.timestamps
    end
  end

  def self.down
    drop_table :publication_impressions
  end
end
于 2013-08-26T04:03:05.013 に答える