2017-04-18 4 views
1

J'utilise Rails 5. Je veux utiliser le cache de stockage en mémoire Rails pour mettre les données en mémoire cache, mais je ne voudrais pas mettre ces données en cache si la valeur des données est nulle. Comment puis-je faire cela? Je thoguth Je coudl cache Rails et étends écrire ma propre méthode, donc j'ai trouvé le code ci-dessousComment puis-je dire à Rails inmemory cache de ne pas créer d'entrée si la valeur est nulle?

module ActiveSupport 
module Cache 
    class Store 
     def fetch_no_nil(name, options = nil) 
     if block_given? 
      options = merged_options(options) 
      key = namespaced_key(name, options) 

      cached_entry = find_cached_entry(key, name, options) unless options[:force] 
      entry = handle_expired_entry(cached_entry, key, options) 

      if entry 
      get_entry_value(entry, name, options) 
      else 
      save_block_result_to_cache_if_not_nil(name, options) { |_name| yield _name } 
      end 
     else 
      read(name, options) 
     end 
     end 
     private 
     def save_block_result_to_cache_if_not_nil(name, options) 
     result = instrument(:generate, name, options) do |payload| 
      yield(name) 
     end 
     write(name, result, options) unless result.nil? 
     result 
     end 
    end 
    end 
end 

cependant, cela ne semble pas travailler sur Raisl 5. Je reçois l'erreur ci-dessous lorsque j'invoque la « fetch_no_nil "méthode ...

Please use `normalize_key` which will return a fully resolved key. 
(called from fetch_no_nil at /Users/davea/Documents/workspace/myproject/config/initializers/enhanced_cache.rb:7) 
NoMethodError: undefined method `find_cached_entry' for #<ActiveSupport::Cache::MemoryStore:0x007fa6b92ae088> 
    from /Users/davea/Documents/workspace/myproject/config/initializers/enhanced_cache.rb:9:in `fetch_no_nil' 
    from /Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:116:in `get_cached_content' 
    from /Users/davea/Documents/workspace/myproject/app/helpers/webpage_helper.rb:73:in `get_url' 
    from (irb):1 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/console.rb:65:in `start' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/console_helper.rb:9:in `start' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/commands_tasks.rb:78:in `console' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands/commands_tasks.rb:49:in `run_command!' 
    from /Users/davea/.rvm/gems/ruby-2.4.0/gems/railties-5.0.2/lib/rails/commands.rb:18:in `<top (required)>' 
    from bin/rails:4:in `require' 
    from bin/rails:4:in `<main>' 

y at-il une autre façon, je peux demander à mon cache Rails de ne pas créer une entrée si la valeur est nulle?

Répondre

0

Ne pas monkeypatch ActiveSupport::Cache. Il suffit d'écrire une méthode d'emballage:

def self.cache_unless_nil(key, value) 
    Rails.cache.fetch(key) { value } unless value.nil? 
end 

objets Puis cache en appelant votre emballage:

cache_unless_nil("foo", "bar") 
Rails.cache.fetch("foo") 
#=> "bar" 
cache_unless_nil("baz", nil) 
Rails.cache.fetch("baz") 
#=> nil