是否每次加载页面时都会执行每个相关计算?

时间:2015-02-13 04:15:57

标签: ruby-on-rails ruby performance ruby-on-rails-4 load

我有一个模型" Wrapper",其中包含另一个模型"类别",反过来又有另一个模型," Thing"。

"东西"具有整数属性:count:number。它还有一个在models/thing.rb

中定义的实例方法
def ratio
  (self.count + self.number).to_f / Thing.all.count.to_f
end

"类别"然后,具有此实例方法,在models/category.rb中定义:

def thing_ratios
  self.things.sum(&:ratio.to_f)
end

最后,我的wrapper.html.erb视图显示了按thing_ratios

的顺序列出的类别
<%= @wrapper.categories.all.order(&:thing_ratios).each do |category| %>
  ...

我的问题是这样的:每当有人重新加载页面wrapper.html.erb时,每次相关计算都必须重新计算,对于与页面上每个类别相关联的每个Thing,一直到self.count

2 个答案:

答案 0 :(得分:2)

除了@Kelseydh提供的资源之外,您还可以考虑当您作为同一请求的一部分多次点击同一函数时的memoization。但是,在处理请求后,它不会保留其值。

答案 1 :(得分:1)

是的,每次都会重新计算。如果这是一项昂贵的操作,您应该为计数添加counter_cache(指南:http://railscasts.com/episodes/23-counter-cache-column),并使用像memcache这样的服务来查看缓存查询结果。

存在许多缓存策略,但对于数据库/ Rails应用程序本身,俄罗斯娃娃缓存被认为是最灵活的方法。如果您的数据不经常更新(这意味着您不必经常担心缓存过期),您可以通过页面缓存获取 - 如果是这样,请自己计算幸运。

帮助您入门的一些资源:

DHH关于俄罗斯娃娃缓存:https://signalvnoise.com/posts/3113-how-key-based-cache-expiration-works)。

缓存键上的Railscast:http://railscasts.com/episodes/387-cache-digests

高级缓存指南:http://hawkins.io/2012/07/advanced_caching_revised/

不是免费的,但我发现这个系列真正让我理解了各种形式的缓存: http://www.pluralsight.com/courses/rails-4-1-performance-fundamentals