Ruby 记忆化是如何工作的?

How does Ruby Memoization work?

我听说过记忆的好处,但我不确定它是如何工作的。例如,在:

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

据我所知,@twitter_followers 是一个实例变量,只会保留在一个请求的范围内(以便视图可以访问它。)

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

您可以拥有 User 的实例并在不同的地方进行 user.twitter_followers 调用。

没有记忆意味着每次调用 user.twitter_followers 都会有新的 twitter_user.followers 请求,而使用记忆只会完成一个请求,并且每个后续调用都将使用 set @twitter_followers 变量。

So I am not sure if the same user refreshes the same page again will it use the cached result instead of firing the query?

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

在视图中,可以使用记忆化的优势,正如我的回答所暗示的,例如,如果您在这个页面中多次引用 user.twitter_followers

在 models/services/workers/any 其他具有记忆功能的后端相关地方确实有所不同。

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