Ruby Memoization如何工作?

时间:2017-02-27 09:32:46

标签: ruby-on-rails 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是一个实例变量,只会保留在一个请求的范围内(以便视图可以访问它。)

我不确定相同的用户是否刷新同一页面,是否会使用缓存的结果而不是触发查询。

2 个答案:

答案 0 :(得分:3)

您可以在不同的地方拥有User个实例和user.twitter_followers个来电。

如果没有记忆,则每次调用twitter_user.followers都会产生新的user.twitter_followers请求,而memoization只会执行一个请求,并且每个后续调用都将使用set @twitter_followers变量。

  

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

通过页面刷新,它将成为新请求。

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

在模特/服务/工人/任何其他与后端相关的地方进行记忆确实有所作为。

答案 1 :(得分:1)

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