当值为nil时,Rails继续缓存

时间:2014-03-26 13:07:33

标签: ruby-on-rails ruby

Rails 3.2.13缓存键,当值为nil时。一直在查看文档以查找是否有任何选项可以设置为停止此行为,但无法找到任何。

当值为nil时,有没有阻止Rails缓存密钥?

1.8 :001 > value = nil
 => nil 
1.8 :002 > Rails.cache.fetch('foo'){value}
 => nil 
1.8 :003 > value = true
 => true 
1.8 :004 > Rails.cache.fetch('foo'){value}
 => nil

3 个答案:

答案 0 :(得分:3)

Rails缓存中没有内置选项来执行此操作,因此我将使用自定义方法来完成您想要的操作,如下所示:

def fetch(key, value)
  if Rails.cache.exist?(key)
    Rails.cache.read(key)
  else 
    Rails.cache.write(key, value) unless value.nil?
  end
end

fetch('foo', nil)
# => nil
fetch('foo', true)
# => true

答案 1 :(得分:0)

不确定是什么问题,nil值将被忽略:

Rails.cache.fetch('foo') { nil }
Cache read: foo
Cache generate: foo
Cache write: foo
 => nil 

Rails.cache.fetch('foo'){ "bar" }
Cache read: foo
Cache generate: foo
Cache write: foo
 => "bar" 

Rails.cache.fetch('foo'){ nil }
Cache read: foo
Cache fetch_hit: foo
 => "bar" 

答案 2 :(得分:-1)

更新的答案:cache_nils选项是您正在寻找的选项。检查您正在使用的缓存商店,以防它不支持,但对于dalli_store有效:

1.8 :001 > value = nil
 => nil 
1.8 :002 > Rails.cache.fetch('foo'){ value }
 => nil 
1.8 :003 > value = true
 => true 
1.8 :004 > Rails.cache.fetch('foo', cache_nils: false){ value }
 => true