2

现在我有一个名为 Campaigns 的表,它有很多 Hits,如果我打电话说:

Campaign.find(30).hits

这需要 4 秒或 4213 毫秒。

如果我改为调用它:

广告系列 = Campaign.find(30)
广告系列点击数

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

我试图找出一种聪明的方法来加载/计算我的点击量。我正在考虑向我的 Campaign.rb 模型添加一个方法,例如:

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

我知道查询不会从hits表中加载,但这只是从自制查询中计算它的一个示例,与 Ruby on Rails 为我做这件事相反。

这个 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
    }
结尾

任何建议都会很棒!

4

2 回答 2

6

怎么样:

Campaign.find(30).hits.count

您还可以考虑添加以下内容hit.rb(假设广告系列和点击之间存在一对多的关系)。

belongs_to :campaign, :counter_cache => true

然后,您需要在campaigns表中有一列名为hits_count. hits如果您只获得计数,这将完全避免命中。

您可以检查API以获取完整的概要。

于 2009-02-04T02:47:46.917 回答
1

我的 ActiveRecord 可能有点生疏,如果是这样,请原谅我,但 IIRCCampaign.find(30).hits至少是两个单独的查询。怎么Campaign.find(30, :include => [ :hits ]).hits做?那应该执行一个查询。

于 2009-02-04T02:36:42.197 回答