Sha256: de13ae8b5ab6c69f6c37ae7eac7dee83829d208111162023b631d3280c15cde6

Contents?: true

Size: 1.91 KB

Versions: 28

Compression:

Stored size: 1.91 KB

Contents

# Use singleton class Spree::Preferences::Store.instance to access
#

require 'singleton'

module Spree::Preferences

  class StoreInstance

    def initialize
      @cache = Rails.cache
    end

    def set(key, value)
      @cache.write(key, value)
      persist(key, value)
    end
    alias_method :[]=, :set

    def exist?(key)
      @cache.exist?(key) ||
      should_persist? && Spree::Preference.where(:key => key).exists?
    end

    def get(key)
      # return the retrieved value, if it's in the cache
      # use unless nil? incase the value is actually boolean false
      #
      unless (val = @cache.read(key)).nil?
        return val
      end

      if should_persist?
        # If it's not in the cache, maybe it's in the database, but
        # has been cleared from the cache

        # does it exist in the database?
        if preference = Spree::Preference.find_by_key(key)
          # it does exist
          val = preference.value
        else
          # use the fallback value
          val = yield
        end

        # Cache either the value from the db or the fallback value.
        # This avoids hitting the db with subsequent queries.
        @cache.write(key, val)

        return val
      else
        yield
      end
    end
    alias_method :fetch, :get

    def delete(key)
      @cache.delete(key)
      destroy(key)
    end

    def clear_cache
      @cache.clear
    end

    private

    def persist(cache_key, value)
      return unless should_persist?

      preference = Spree::Preference.where(:key => cache_key).first_or_initialize
      preference.value = value
      preference.save
    end

    def destroy(cache_key)
      return unless should_persist?

      preference = Spree::Preference.find_by_key(cache_key)
      preference.destroy if preference
    end

    def should_persist?
      Spree::Preference.table_exists?
    end

  end

  class Store < StoreInstance
    include Singleton
  end

end

Version data entries

28 entries across 28 versions & 1 rubygems

Version Path
solidus_core-1.2.3 app/models/spree/preferences/store.rb
solidus_core-1.1.4 app/models/spree/preferences/store.rb
solidus_core-1.0.7 app/models/spree/preferences/store.rb
solidus_core-1.0.6 app/models/spree/preferences/store.rb
solidus_core-1.2.2 app/models/spree/preferences/store.rb
solidus_core-1.2.1 app/models/spree/preferences/store.rb
solidus_core-1.1.3 app/models/spree/preferences/store.rb
solidus_core-1.0.5 app/models/spree/preferences/store.rb
solidus_core-1.2.0 app/models/spree/preferences/store.rb
solidus_core-1.2.0.rc2 app/models/spree/preferences/store.rb
solidus_core-1.0.4 app/models/spree/preferences/store.rb
solidus_core-1.1.2 app/models/spree/preferences/store.rb
solidus_core-1.2.0.rc1 app/models/spree/preferences/store.rb
solidus_core-1.2.0.beta1 app/models/spree/preferences/store.rb
solidus_core-1.0.3 app/models/spree/preferences/store.rb
solidus_core-1.1.1 app/models/spree/preferences/store.rb
solidus_core-1.1.0 app/models/spree/preferences/store.rb
solidus_core-1.1.0.pre2 app/models/spree/preferences/store.rb
solidus_core-1.1.0.pre1 app/models/spree/preferences/store.rb
solidus_core-1.1.0.beta1 app/models/spree/preferences/store.rb