module Kasket::WriteMixin::InstanceMethods

Public Instance Methods

clear_kasket_indices(options = {}) click to toggle source
# File lib/kasket/write_mixin.rb, line 81
def clear_kasket_indices(options = {})
  kasket_keys(options).each do |key|
    Kasket.cache.delete(key)
  end
end
committed!(*args, **kwargs) click to toggle source
Calls superclass method
# File lib/kasket/write_mixin.rb, line 114
def committed!(*args, **kwargs)
  Kasket.clear_pending_records
  kasket_after_commit if persisted? || destroyed?
  super
end
default_kasket_cacheable?() click to toggle source
# File lib/kasket/write_mixin.rb, line 28
def default_kasket_cacheable?
  true
end
kasket_after_commit() click to toggle source
# File lib/kasket/write_mixin.rb, line 68
def kasket_after_commit
  keys = kasket_keys

  if persisted? && Kasket::CONFIGURATION[:write_through]
    key = store_in_kasket
    keys.delete(key)
  end

  keys.each do |key|
    Kasket.cache.delete(key)
  end
end
kasket_after_commit_dummy() click to toggle source
# File lib/kasket/write_mixin.rb, line 102
def kasket_after_commit_dummy
  # This is here to force committed! to be invoked.
end
kasket_after_destroy() click to toggle source
# File lib/kasket/write_mixin.rb, line 110
def kasket_after_destroy
  Kasket.add_pending_record(self, _destroyed = true)
end
kasket_after_save() click to toggle source
# File lib/kasket/write_mixin.rb, line 106
def kasket_after_save
  Kasket.add_pending_record(self)
end
kasket_key() click to toggle source
# File lib/kasket/write_mixin.rb, line 24
def kasket_key
  @kasket_key ||= new_record? ? nil : self.class.kasket_key_for_id(id)
end
kasket_keys(options = {}) click to toggle source
# File lib/kasket/write_mixin.rb, line 40
def kasket_keys(options = {})
  attribute_sets = [attributes]

  previous_changes = options[:previous_changes]
  previous_changes ||= saved_changes.transform_values(&:first)
  if previous_changes.present?
    old_attributes = previous_changes.each_with_object({}) do |(attribute, (old, _)), all|
      all[attribute.to_s] = old
    end
    attribute_sets << old_attributes.reverse_merge(attribute_sets[0])
    attribute_sets << attribute_sets[0].merge(old_attributes)
  end

  keys = []
  self.class.kasket_indices.each do |index|
    keys.concat(
      attribute_sets.map do |attribute_set|
        key = self.class.kasket_key_for(index.map { |attribute| [attribute, attribute_set[attribute.to_s]] })
        index.include?(:id) ? key : [key, key + '/first']
      end
    )
  end

  keys.flatten!
  keys.uniq!
  keys
end
reload(*) click to toggle source
Calls superclass method
# File lib/kasket/write_mixin.rb, line 87
def reload(*)
  clear_kasket_indices
  super
end
rolledback!(*args, **kwargs) click to toggle source
Calls superclass method
# File lib/kasket/write_mixin.rb, line 120
def rolledback!(*args, **kwargs)
  Kasket.clear_pending_records
  super
end
store_in_kasket(key = kasket_key) click to toggle source
# File lib/kasket/write_mixin.rb, line 32
def store_in_kasket(key = kasket_key)
  if kasket_cacheable? && key
    options = { expires_in: self.class.kasket_ttl } if self.class.kasket_ttl
    Kasket.cache.write(key, attributes_before_type_cast.dup, options)
    key
  end
end
update_columns(new_attributes) click to toggle source
Calls superclass method
# File lib/kasket/write_mixin.rb, line 92
def update_columns(new_attributes)
  previous_attributes = attributes
  previous_changes = new_attributes.each_with_object({}) do |(k, v), all|
    all[k] = [previous_attributes[k.to_s], v]
  end
  result = super
  clear_kasket_indices(previous_changes: previous_changes)
  result
end