class AttributeDependsCalculator::Factory

Attributes

association[RW]
column[RW]
klass[RW]
parameter[RW]

Public Class Methods

new(klass, column, params) click to toggle source
# File lib/attribute_depends_calculator/factory.rb, line 14
def initialize(klass, column, params)
  self.klass, self.column = klass, column
  self.parameter = Parameter.new(params)
  self.association = fetch_association
end

Public Instance Methods

perform() click to toggle source
# File lib/attribute_depends_calculator/factory.rb, line 20
def perform
  define_calculator
  define_operator_callback
  append_callbacks
end

Private Instance Methods

after_callback_proc() click to toggle source
# File lib/attribute_depends_calculator/factory.rb, line 72
def after_callback_proc

  method_name = calculate_method_name
  klass_name = klass.name

  lambda { |record|
    attr_name = record.class.reflect_on_all_associations.find {|assoc| assoc.class_name == klass_name}.name
    record.public_send(attr_name).send(method_name)
  }

end
append_callback_hook() click to toggle source
# File lib/attribute_depends_calculator/factory.rb, line 65
def append_callback_hook

  association.after_save after_callback_proc
  association.after_destroy after_callback_proc

end
append_callbacks() click to toggle source
# File lib/attribute_depends_calculator/factory.rb, line 61
def append_callbacks
  append_callback_hook
end
calculate() click to toggle source
# File lib/attribute_depends_calculator/factory.rb, line 37
def calculate
  if self.proc?
    "self.#{column}_depends_callback(#{depend_association_name})"
  else
    "self.#{depend_association_name}.#{expression}"
  end
end
calculate_method_name() click to toggle source
# File lib/attribute_depends_calculator/factory.rb, line 53
def calculate_method_name
  "calculate_and_update_#{column}"
end
define_calculator() click to toggle source
# File lib/attribute_depends_calculator/factory.rb, line 28
    def define_calculator
      self.klass.class_eval <<-METHOD, __FILE__, __LINE__ + 1
        def #{calculate_method_name}
          total = #{calculate}
          update(:#{column} => total)
        end
      METHOD
    end
define_operator_callback() click to toggle source
# File lib/attribute_depends_calculator/factory.rb, line 45
def define_operator_callback
  callback, column = self.callback, self.column
  return if callback.nil?
  self.klass.class_eval do
    define_method "#{column}_depends_callback", &callback
  end
end
fetch_association() click to toggle source
# File lib/attribute_depends_calculator/factory.rb, line 57
def fetch_association
  ObjectSpace.const_get klass.reflect_on_association(depend_association_name).class_name
end