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

我有一个模型“Wrapper”,其中包含另一个模型“Category”,其中又有另一个模型“Thing”。

“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顺序列出的thing_ratios

  ... 

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

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

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

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

一些资源可以帮助您入门:

DHH on Russian Doll Caching: 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/

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