Sha256: b21db99f98bdca69754060ffb55e293ea31f9293ac304365e1509fd239ef6e20

Contents?: true

Size: 1.3 KB

Versions: 1

Compression:

Stored size: 1.3 KB

Contents

module Cacheable
  module ModelFetch
    def fetch(key, options=nil)
      unless result = read(key, options)
        if block_given?
          result = yield
          write(key, result, options) unless result.nil?
        end
      end
      result
    end

    private

    def write(key, value, options=nil)
      options ||= {}

      coder = if !value.is_a?(Hash) && value.respond_to?(:to_a)
        value.to_a.map {|obj| coder_from_record(obj) }
      else
        coder_from_record(value)
      end

      Rails.cache.write(key, coder, options)
      coder
    end

    def read(key, options=nil)
      options ||= {}
      value = Rails.cache.read(key, options)
      return nil if value.nil?

      if !coder?(value) && value.respond_to?(:to_a)
        value.to_a.map { |obj| record_from_coder(obj) }
      else
        record_from_coder(value)
      end
    end

    def coder_from_record(record)
      return if record.nil?
      return record unless record.is_a?(ActiveRecord::Base)

      coder = { :class => record.class }
      record.encode_with(coder)
      coder
    end

    def record_from_coder(coder)
      return coder unless coder?(coder)
      record = coder[:class].allocate
      record.init_with(coder)
    end

    def coder?(value)
      value.is_a?(Hash) && value[:class].present?
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
simple_cacheable-1.5.0 lib/cacheable/model_fetch.rb