Sha256: bbb6dfcb1a523141dd6af842addc50446338e0748426e587f8d671ff1ec28ce8
Contents?: true
Size: 1.82 KB
Versions: 3
Compression:
Stored size: 1.82 KB
Contents
module Counter module Cache module Counters class BufferCounter class Saver < Struct.new(:options) def save! return unless relation_object old_value = current_column_value new_value = calculate_new_value save_new_value!(new_value) yield old_value, new_value, relation_object, options.column if block_given? end private def save_new_value!(value) relation_object.send("#{options.column}=", value) relation_object.save!(validate: false) end def calculate_new_value return current_column_value + counter_value.to_i if options.cached? && counter_value non_cached_count.to_i end def non_cached_count method = options.method return relation_object.send(method) if method && relation_object.respond_to?(method) relation_object.send(options.source_object_class_name.table_name).count end def current_column_value relation_object.send(options.column).to_i end def counter_value @counter_value ||= get.tap { |v| reset if v } end def get counting_data_store.get(key) end def reset counting_data_store.del(key) end def key Key.new(nil, options).to_s end def counting_data_store Counter::Cache.configuration.counting_data_store end def relation_object @relation_object ||= constantized_relation.find_by_id(options.relation_id) end def constantized_relation Object.const_get(options.relation_class_name) end end end end end end
Version data entries
3 entries across 3 versions & 1 rubygems