代码之家  ›  专栏  ›  技术社区  ›  Garrett

更好的协会绩效

  •  2
  • Garrett  · 技术社区  · 15 年前

    现在我有一个名为campaigns的表,它有很多点击率,如果我打电话说:

    Campaign.find(30).hits

    这需要4秒,或者4213毫秒。

    如果我改为这样称呼:

    campaign = Campaign.find(30)
    campaign.hits.count
    

    它是否仍然加载所有点击,然后计数?或者它看到我正在计数并避免加载所有点击量?(目前超过300000行)。

    我正试图想出一个聪明的方法来加载/计算我的点击量。我正在考虑给campaign.rb模型添加一个方法,比如:

    def self.total_hits
       find :first, :select => 'COUNT(id) as hits', :conditions => ["campaign_id = ?", self.id]
    end
    

    我知道查询不会从 hits 表,但这只是从一个自制的查询中计算它的一个例子,该查询与RubyonRails为我做这件事的关系密切。

    这个memcache查询会更有效吗?(我有它在运行,但似乎没有更好/更快/更慢,只有相同的速度。)

    def self.hits
        Rails.cache.fetch("Campaign_Hits_#{self.campaign_id}", :expires_in => 40) {
          find(:first, :select => 'COUNT(id) as hits', :conditions => ["campaign_id = ?", self.campaign_id]).hits
        }
    end
    

    任何建议都很好!

    2 回复  |  直到 15 年前
        1
  •  6
  •   Abie    15 年前

    怎么样:

    Campaign.find(30).hits.count
    

    您也可以考虑在 hit.rb (假设活动和点击量之间存在一对多关系)。

    belongs_to :campaign, :counter_cache => true
    

    然后需要在 campaigns 表称为 hits_count . 这样可以避免撞击 hits 总之,如果你只想数数的话。

    你可以查一下 API 进行全面的总结。

        2
  •  1
  •   Logan Capaldo    15 年前

    我的活动记录可能有点生锈,所以如果是的话请原谅我,但是IIRC Campaign.find(30).hits 至少是两个独立的查询。如何 Campaign.find(30, :include => [ :hits ]).hits 怎么办?应该执行单个查询。