class ViewModel::ActiveRecord::Cache

Cache for ViewModels that wrap ActiveRecord models.

Attributes

viewmodel_class[R]

Public Class Methods

new(viewmodel_class, cache_group: nil) click to toggle source

If cache_group: is specified, it must be a group of a single key: `:id`

# File lib/view_model/active_record/cache.rb, line 39
def initialize(viewmodel_class, cache_group: nil)
  @viewmodel_class = viewmodel_class

  @cache_group = cache_group || create_default_cache_group
  @migrated_cache_group = @cache_group.register_child_group(:migrated, :version)

  # /viewname/:id/viewname-currentversion
  @cache = @cache_group.register_cache(cache_name)

  # /viewname/:id/migrated/:oldversion/viewname-currentversion
  @migrated_cache = @migrated_cache_group.register_cache(cache_name)
end
render_from_cache(viewmodel_class, ids, initial_viewmodels: nil, migration_versions: {}, locked: false, serialize_context: viewmodel_class.new_serialize_context) click to toggle source
# File lib/view_model/active_record/cache.rb, line 32
def render_from_cache(viewmodel_class, ids, initial_viewmodels: nil, migration_versions: {}, locked: false, serialize_context: viewmodel_class.new_serialize_context)
  worker = CacheWorker.new(migration_versions: migration_versions, serialize_context: serialize_context)
  worker.render_from_cache(viewmodel_class, ids, initial_viewmodels: initial_viewmodels, locked: locked)
end
render_viewmodels_from_cache(viewmodels, migration_versions: {}, locked: false, serialize_context: nil) click to toggle source
# File lib/view_model/active_record/cache.rb, line 15
def render_viewmodels_from_cache(viewmodels, migration_versions: {}, locked: false, serialize_context: nil)
  if viewmodels.empty?
    return [], {}
  end

  ids = viewmodels.map(&:id)
  # ideally the roots wouldn't have to all be the same type
  viewmodel_class = viewmodels.first.class
  serialize_context ||= viewmodel_class.new_serialize_context

  render_from_cache(viewmodel_class, ids,
                    initial_viewmodels: viewmodels,
                    migration_versions: migration_versions,
                    locked: locked,
                    serialize_context: serialize_context)
end

Public Instance Methods

cache_for(migration_version) click to toggle source
# File lib/view_model/active_record/cache.rb, line 314
def cache_for(migration_version)
  if migration_version
    @migrated_cache
  else
    @cache
  end
end
cache_version() click to toggle source
# File lib/view_model/active_record/cache.rb, line 346
def cache_version
  @cache_version ||=
    begin
      versions = @viewmodel_class.deep_schema_version(include_referenced: false)
      ViewModel.schema_hash(versions)
    end
end
clear() click to toggle source
# File lib/view_model/active_record/cache.rb, line 58
def clear
  @cache_group.invalidate_cache_group
end
delete(*ids) click to toggle source
# File lib/view_model/active_record/cache.rb, line 52
def delete(*ids)
  ids.each do |id|
    @cache_group.delete_all(@cache.key.new(id))
  end
end
fetch(ids, initial_viewmodels: nil, migration_versions: {}, locked: false, serialize_context: @viewmodel_class.new_serialize_context) click to toggle source

@deprecated Replaced by class methods

# File lib/view_model/active_record/cache.rb, line 69
def fetch(ids, initial_viewmodels: nil, migration_versions: {}, locked: false, serialize_context: @viewmodel_class.new_serialize_context)
  self.class.render_from_cache(@viewmodel_class, ids,
                               initial_viewmodels: initial_viewmodels, locked: locked,
                               migration_versions: migration_versions, serialize_context: serialize_context)
end
fetch_by_viewmodel(viewmodels, migration_versions: {}, locked: false, serialize_context: @viewmodel_class.new_serialize_context) click to toggle source

@deprecated Replaced by class methods

# File lib/view_model/active_record/cache.rb, line 63
def fetch_by_viewmodel(viewmodels, migration_versions: {}, locked: false, serialize_context: @viewmodel_class.new_serialize_context)
  ids = viewmodels.map(&:id)
  fetch(ids, initial_viewmodels: viewmodels, migration_versions: migration_versions, locked: locked, serialize_context: serialize_context)
end
id_for(key) click to toggle source
# File lib/view_model/active_record/cache.rb, line 330
def id_for(key)
  key[:id]
end
key_for(id, migration_version) click to toggle source
# File lib/view_model/active_record/cache.rb, line 322
def key_for(id, migration_version)
  if migration_version
    @migrated_cache.key.new(id, migration_version)
  else
    @cache.key.new(id)
  end
end
load(ids, migration_version) click to toggle source
# File lib/view_model/active_record/cache.rb, line 340
def load(ids, migration_version)
  keys = ids.map { |id| key_for(id, migration_version) }
  results = cache_for(migration_version).read_multi(keys)
  results.transform_keys! { |key| id_for(key) }
end
migrated_cache_version(migration_versions) click to toggle source
# File lib/view_model/active_record/cache.rb, line 354
def migrated_cache_version(migration_versions)
  versions = ViewModel::Migrator.migrated_deep_schema_version(viewmodel_class, migration_versions, include_referenced: false)
  version_hash = ViewModel.schema_hash(versions)

  if version_hash == cache_version
    # no migrations affect this view
    nil
  else
    version_hash
  end
end
store(id, migration_version, data_serialization, ref_cache) click to toggle source

Save the provided serialization and reference data in the cache

# File lib/view_model/active_record/cache.rb, line 335
def store(id, migration_version, data_serialization, ref_cache)
  key = key_for(id, migration_version)
  cache_for(migration_version).write(key, { data: data_serialization, ref_cache: ref_cache })
end

Private Instance Methods

cache_name() click to toggle source

Statically version the cache name based on the (current) deep schema versions of the constituent viewmodels, so that viewmodel changes force invalidation.

# File lib/view_model/active_record/cache.rb, line 375
def cache_name
  "vmcache_#{cache_version}"
end
create_default_cache_group() click to toggle source
# File lib/view_model/active_record/cache.rb, line 368
def create_default_cache_group
  IknowCache.register_group(@viewmodel_class.name, :id)
end