我有一个模型" 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
?
答案 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