Observer code:
class ProjectObserver < ActiveRecord::Observer def new_update(callback_method, object, developer = nil) if developer send(callback_method, object, developer) if respond_to?(callback_method) else old_update(callback_method, object) end end alias_method :old_update, :update alias_method :update, :new_update def before_add_developer(project, developer) puts "Adding #{developer}..." end def after_add_developer(project, developer) puts "Added #{developer}..." end def after_save(project) puts "Project saved..." end end
Model:
class Project < ActiveRecord::Base has_and_belongs_to_many :developers def add_developer(developer) self.class.changed self.class.notify_observers(:before_add_developer, self, developer) transaction do self.developers << developer self.save end self.class.changed self.class.notify_observers(:after_add_developer, self, developer) end end
It would be great if I could override the self.developers#<< method instead...