2017-02-27 28 views
2

我听说过记忆的好处,但我不确定它是如何工作的。对于实施例,在:Ruby Memoization如何工作?

class User < ActiveRecord::Base 
    def twitter_followers 
    # assuming twitter_user.followers makes a network call 
    @twitter_followers ||= twitter_user.followers 
    end 
end 

按照我所知,@twitter_followers是一个实例变量,并且将仅保留在范围为一个请求

I(所以,这将是由视图访问。)我不确定相同的用户是否刷新同一页面,是否会使用缓存的结果而不是查询。

+0

术语是“memoization”,顺便说一句。 –

回答

3

您可以有一个User的实例,并在不同的地方有user.twitter_followers调用。

没有记忆化就意味着新的twitter_user.followers要求每调用user.twitter_followers,而与记忆化只有一个请求将完成每随之而来的通话将使用设置@twitter_followers变量。

所以我不确定是否同一用户再次刷新相同的页面将 它使用缓存的结果,而不是发射查询?

随着页面刷新它将是新的请求。

在视图中,可以使用memoization的优点,正如我的答案所暗示的,例如,如果在此单个页面内,您不止一次引用user.twitter_followers

在模型/服务/工人/任何其他后备相关的地方有记忆真的是有所作为。

+0

因此,如果有新的要求,记忆就不适用了,对吗?只有在一个请求中有多个对同一事物的调用时,这才是有益的。 –

+0

@DeepakKumarPadhy是的,每个新的请求==新的请求到twitter。如果你从用户的角度思考它,这是一件好事;) –

+0

非常感谢你的非常清晰的解释。 –

1

首先它会触发查询,它作为用户模型实例的实例变量存储在内存中。用户模型的实例将始终根据请求重新加载。