module Cacheable::ModelFetch

Public Instance Methods

fetch(key, options=nil) { || ... } click to toggle source
# File lib/cacheable/model_fetch.rb, line 3
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 Instance Methods

coder?(value) click to toggle source
# File lib/cacheable/model_fetch.rb, line 57
def coder?(value)
  value.is_a?(Hash) && value[:class].present?
end
coder_from_record(record) click to toggle source
# File lib/cacheable/model_fetch.rb, line 40
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
read(key, options=nil) click to toggle source
# File lib/cacheable/model_fetch.rb, line 28
def read(key, options=nil)
  options ||= {}
  value = Rails.cache.read(key, options)
  return nil if value.nil?

  if !value.is_a?(Hash) && value.respond_to?(:to_a)
    value.to_a.map { |obj| record_from_coder(obj) }
  else
    record_from_coder(value)
  end
end
record_from_coder(coder) click to toggle source
# File lib/cacheable/model_fetch.rb, line 49
def record_from_coder(coder)
  return coder unless coder?(coder)
  klass = coder[:class]
  return coder unless klass.is_a?(Class)
  record = klass.allocate
  record.init_with(coder)
end
write(key, value, options=nil) click to toggle source
# File lib/cacheable/model_fetch.rb, line 15
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