为什么在Rails.cache.fetch之后执行此代码块

时间:2018-11-16 14:37:34

标签: ruby-on-rails ruby redis codeblocks

我有这行代码可以完全执行我想要的操作。但是我不知道为什么会起作用。

  Rails.cache.fetch(key, expires_in: 1.day) do
    a << b
  end

如果该键在Rails缓存中不存在,则应该将b添加到a中。

为什么我感到困惑?

      Rails.cache.fetch(key, expires_in: 1.day)

返回nil,无论密钥是否已在高速缓存中。

问题: 为什么在高速缓存中没有密钥的情况下代码块会运行,而在其他情况下则不会运行?

其他详细信息:Rails缓存已连接到Redis。

1 个答案:

答案 0 :(得分:0)

尽管do ... end返回Rails.cache.fetch,但评估nil块可能会令人困惑。但是do ... end块不会在nil响应之上运行。

实际上,do ... end块是fetch方法调用的附加参数。看看source code of fetch

没有块fetch基本上只做一件事–在第328行调用read(name, options)。但是,有了块,它的工作方式更多(第307至324行)