每次加载页面时是否都执行了所有相关计算?
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 提供的资源之外,您还可以考虑在同一请求中多次点击同一功能时进行记忆。但是,在请求被处理后,它不会保留它的值。
我有一个模型 "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 提供的资源之外,您还可以考虑在同一请求中多次点击同一功能时进行记忆。但是,在请求被处理后,它不会保留它的值。