从传递给 Rails.cache.fetch 的块返回 nil 值会清除它吗?

The*_*mer 6 ruby-on-rails ruby-on-rails-3

假设我有一个这样的方法:

  def foo
    Rails.cache.fetch("cache_key", :expires_in => 60.minutes) do
      return_something
    end
  end
Run Code Online (Sandbox Code Playgroud)

return_something有时会返回一个nil值。发生这种情况时,我不希望nil将该值缓存 60 分钟。相反,下次我调用 时,我希望再次执行传递foo给的块。fetch

默认情况下是Rails.cache.fetch这样工作的吗?或者我必须实现这个功能吗?

更新(含答案)

事实证明,答案是否定的,至少在使用 Memcached 时是这样。

pho*_*oet 3

这取决于您正在使用的缓存存储的实现。我想说它不应该缓存nil值,但是空字符串可以缓存。

看看dalli store 的实现,即:

  def fetch(name, options=nil)
    options ||= {}
    name = expanded_key name

    if block_given?
      unless options[:force]
        entry = instrument(:read, name, options) do |payload|
          payload[:super_operation] = :fetch if payload
          read_entry(name, options)
        end
      end

      if !entry.nil?
        instrument(:fetch_hit, name, options) { |payload| }
        entry
      else
        result = instrument(:generate, name, options) do |payload|
          yield
        end
        write(name, result, options)
        result
      end
    else
      read(name, options)
    end
  end 
Run Code Online (Sandbox Code Playgroud)

  • Rails 现在支持 `skip_nils` https://github.com/rails/rails/pull/25437 (2认同)