社團

2009-02-04 71 views
2

右鍵更好的性能,現在我有了許多命中,如果我叫表叫廣告活動說:社團

Campaign.find(30).hits

這需要4秒,或4213毫秒。

如果我把這個代替:

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

是否仍然加載所有的點擊量,再算上?還是它看到我在計數,並避免加載所有的點擊? (目前有300,000多行)。

我想弄明白一個聰明的方式加載/計數我的命中。我想添加一個方法我Campaign.rb模型,如:

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

我知道,查詢將不會從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 
    } 
end 

任何建議將是巨大的!

回答

6

如何:

Campaign.find(30).hits.count 

你也可以考慮增加hit.rb以下(假設活動和命中之間的一個一對多的關係)。

belongs_to :campaign, :counter_cache => true 

然後,您需要在campaigns表中的列稱爲hits_count。這樣可以避免僅僅打hits

您可以檢查API爲全面綱要。

+0

未定義的錯誤,它不應該知道無論如何找到30 ID。 – Garrett 2009-02-04 03:32:00

1

我的ActiveRecord的可能會有點生疏,所以如果是的話請原諒我,但IIRC Campaign.find(30).hits至少兩個單獨的查詢。 Campaign.find(30, :include => [ :hits ]).hits如何做?這應該執行一個單一的查詢。

+0

我相信它在這種情況下做同樣的事情。無論如何,兩個查詢會更有效,因爲您不希望它將所有匹配加入到廣告系列行中。所有你需要的基本上是「WHERE campaign_id = 30」 – 2009-02-04 05:42:04