module ActsAsAggregateRoot::ClassMethods

Public Instance Methods

acts_as_aggregate_root() click to toggle source
# File lib/acts_as_aggregate_root/acts_as_aggregate_root.rb, line 7
def acts_as_aggregate_root
  
  def add_destroy_methods_to_class(klass)
    klass.reflections.select {|(k,v)| v.macro == :has_many }.each {|(name,reflection)|
       add_destroy_method(klass,name.to_s)
       reflection.options[:autosave] = true
       add_destroy_methods_to_class(reflection.klass)
    }
  end


  def add_destroy_method(klass,reflection_name)
    klass.instance_eval do
      method_name = "has_many_dependent_destroy_for_#{reflection_name}".to_sym
      define_method(method_name) do
        send(reflection_name).each { |o| o.destroy }
      end
      before_destroy method_name
    end 
  end 

  self.instance_eval do
    def has_many(association_id, options = {}, &extension)
      # options .merge! :autosave => true , :dependent => :destroy
      super
      reflection = create_has_many_reflection(association_id, options, &extension)
      reflection.options[:autosave] = true
      add_destroy_method(self,reflection.name)
      add_destroy_methods_to_class(reflection.klass)
    end
  end
end
add_destroy_method(klass,reflection_name) click to toggle source
# File lib/acts_as_aggregate_root/acts_as_aggregate_root.rb, line 18
def add_destroy_method(klass,reflection_name)
  klass.instance_eval do
    method_name = "has_many_dependent_destroy_for_#{reflection_name}".to_sym
    define_method(method_name) do
      send(reflection_name).each { |o| o.destroy }
    end
    before_destroy method_name
  end 
end
add_destroy_methods_to_class(klass) click to toggle source
# File lib/acts_as_aggregate_root/acts_as_aggregate_root.rb, line 9
def add_destroy_methods_to_class(klass)
  klass.reflections.select {|(k,v)| v.macro == :has_many }.each {|(name,reflection)|
     add_destroy_method(klass,name.to_s)
     reflection.options[:autosave] = true
     add_destroy_methods_to_class(reflection.klass)
  }
end
has_many(association_id, options = {}, &extension) click to toggle source
Calls superclass method
# File lib/acts_as_aggregate_root/acts_as_aggregate_root.rb, line 29
def has_many(association_id, options = {}, &extension)
  # options .merge! :autosave => true , :dependent => :destroy
  super
  reflection = create_has_many_reflection(association_id, options, &extension)
  reflection.options[:autosave] = true
  add_destroy_method(self,reflection.name)
  add_destroy_methods_to_class(reflection.klass)
end