现在我有一个名为 Campaigns 的表,它有很多点击,如果我打电话说:
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 为我做的。
这个内存缓存查询会更有效吗? (我让它运行了,但似乎并没有更好/更快/更慢,只是速度相同。)
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
任何建议都会很棒!
最佳答案
怎么样:
Campaign.find(30).hits.count
您还可以考虑在 hit.rb
中添加以下内容(假设事件和点击之间存在一对多关系)。
belongs_to :campaign, :counter_cache => true
然后您需要在 campaigns
表中添加一个名为 hits_count
的列。如果您只计算计数,这将避免完全命中 hits
。
您可以查看 API完整的纲要。
关于ruby-on-rails - 更好的关联性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/509870/