【问题标题】:Rails: best way to turn these requests into a counter_cacheRails:将这些请求转换为 counter_cache 的最佳方法
【发布时间】:2013-08-26 12:34:11
【问题描述】:

每个页面加载我都有几个这样的请求:

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 列放在哪里?我应该如何编写迁移? ComponentDocument 通过 Publications 处于 has_many 关系中。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 counter-cache


    【解决方案1】:

    假设展示次数是针对Publication,并且展示次数是按每天分组的。

    您可以创建PublicationImpression 模型来作为每个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
    

    【讨论】:

    • 这是个好主意。不过,我不知道我的问题是否清楚,但我根据 both ComponentDocument 计算 Impressions。我正在尝试弄清楚如何最好地实现它。
    • 将计数器字段添加到出版物?我假设Publication 对于每对ComponentDocument 都是唯一的
    • 是的,Publication 是独一无二的。这是ComponentDocument 之间的连接表。我希望使用那个而不是创建一个类似的表。
    • 您仍然需要为计数器创建一个新表,因为计数也应该按天分组。我已更新我的答案以反映这一变化。
    • 啊!说得通。谢谢。
    猜你喜欢
    • 2010-12-14
    • 2017-03-21
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2021-10-16
    • 2013-01-21
    相关资源
    最近更新 更多