class CounterCulture::Reconciler

Constants

ACTIVE_RECORD_VERSION

Attributes

changes[R]
counter[R]
options[R]

Public Class Methods

new(counter, options={}) click to toggle source
# File lib/counter_culture/reconciler.rb, line 15
def initialize(counter, options={})
  @counter, @options = counter, options

  @changes = []
  @reconciled = false
end

Public Instance Methods

reconcile!() click to toggle source
# File lib/counter_culture/reconciler.rb, line 22
def reconcile!
  return false if @reconciled

  if options[:skip_unsupported]
    return false if (foreign_key_values || (counter_cache_name.is_a?(Proc) && !column_names) || delta_magnitude.is_a?(Proc))
  else
    raise "Fixing counter caches is not supported when using :foreign_key_values; you may skip this relation with :skip_unsupported => true" if foreign_key_values
    raise "Must provide :column_names option for relation #{relation.inspect} when :column_name is a Proc; you may skip this relation with :skip_unsupported => true" if counter_cache_name.is_a?(Proc) && !column_names
    raise "Fixing counter caches is not supported when :delta_magnitude is a Proc; you may skip this relation with :skip_unsupported => true" if delta_magnitude.is_a?(Proc)
  end

  Array(associated_model_classes).each do |associated_model_class|
    Reconciliation.new(counter, changes, options, associated_model_class).perform
  end

  @reconciled = true
end

Private Instance Methods

associated_model_class() click to toggle source
# File lib/counter_culture/reconciler.rb, line 55
def associated_model_class
  counter.relation_klass(counter.relation)
end
associated_model_classes() click to toggle source
# File lib/counter_culture/reconciler.rb, line 42
def associated_model_classes
  if polymorphic?
    options[:polymorphic_classes].presence || polymorphic_associated_model_classes
  else
    [associated_model_class]
  end
end
polymorphic_associated_model_classes() click to toggle source
# File lib/counter_culture/reconciler.rb, line 50
def polymorphic_associated_model_classes
  foreign_type_field = relation_reflect(relation).foreign_type
  model.pluck(Arel.sql("DISTINCT #{foreign_type_field}")).compact.map(&:constantize)
end