每次加载页面时是否都执行了所有相关计算?

Is every relavant calculation performed every time the page is loaded?

我有一个模型 "Wrapper",它 has_many 是另一个模型 "Category",它又 has_many 是另一个模型 "Thing"。

"Thing" 具有整数属性 :count:number。它还具有在 models/thing.rb:

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

"Category",那么,有这个实例方法,定义在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,是否必须重新计算每一个相关的计算,一直到 self.count 与每个类别关联的每个事物页面?

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

存在许多缓存策略,但对于 database/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

除了@Kelseydh 提供的资源之外,您还可以考虑在同一请求中多次点击同一功能时进行记忆。但是,在请求被处理后,它不会保留它的值。