module CounterCulture

Constants

VERSION

Public Class Methods

aggregate_counter_updates() { || ... } click to toggle source
# File lib/counter_culture.rb, line 19
def self.aggregate_counter_updates
  return unless block_given?

  Thread.current[:aggregate_counter_updates] = true
  Thread.current[:aggregated_updates] = {}
  Thread.current[:primary_key_map] = {}

  result = yield

  # aggregate the updates for each target record and execute SQL queries
  Thread.current[:aggregated_updates].each do |klass, attrs|
    attrs.each do |rec_id, updates|
      update_snippets = updates.map do |operation, value|
        value = value.call if value.is_a?(Proc)
        %Q{#{operation} #{value.is_a?(String) ? "'#{value}'" : value}} unless value == 0
      end.compact

      if update_snippets.any?
        klass
          .where(Thread.current[:primary_key_map][klass] => rec_id)
          .update_all(update_snippets.join(', '))
      end
    end
  end

  result
ensure
  Thread.current[:aggregate_counter_updates] = false
  Thread.current[:aggregated_updates] = nil
  Thread.current[:primary_key_map] = nil
end
config() { |self| ... } click to toggle source
# File lib/counter_culture.rb, line 14
def self.config
  yield(self) if block_given?
  self
end