ruby-on-rails - 更好的关联性能

标签 ruby-on-rails activerecord associations

现在我有一个名为 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/

相关文章:

ruby-on-rails - 如何添加本地主机 :3000 to Facebook App for development

php - Codeigniter 事件记录类错误与 MySQL 原始查询

ruby-on-rails - rake 中止!加载错误 : no such file to load -- active_record/connection_adapters/postgresql/explain_pretty_printer

ruby-on-rails - 在 rake 任务中接收到 "ActiveRecord::StatementInvalid: PG::ConnectionBad: PQconsumeInput() could not receive data from server: Connection timed out"

mysql - 基于关联数的 SQL 条件

sql - 通过模型关联对nodejs进行序列化

javascript - 使用单个 AJAX 请求同时保存多个记录?

ruby-on-rails - RSpec::Core::ExampleGroup::Nested_2 中未定义的方法 `it'

ruby-on-rails - Rails 命令无法正常工作

postgresql - sequelize(v 4.3.0) 中的关联与自定义主键