# Overrite ActiveRecord Methods in Plugin

**URL:** <https://www.ruby-forum.com/t/overrite-activerecord-methods-in-plugin/170074>\
**Category:** Rails\
**Created:** [June 12, 2009, 12:05am UTC](https://www.ruby-forum.com/t/overrite-activerecord-methods-in-plugin/170074 "2009-06-12T00:05:21Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![n3rdgir1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/7cd45c/32.png) [@n3rdgir1](https://www.ruby-forum.com/u/n3rdgir1)\
**Post date:** [June 12, 2009, 12:05am UTC](https://www.ruby-forum.com/t/overrite-activerecord-methods-in-plugin/170074/1 "2009-06-12T00:05:21Z")

</div>

I’m trying to write an acts\_as\_ plugin for my rails app, and I need to  
override valid? and update\_attributes. No matter what I do, I can’t get  
it to call my plugin methods, but it will call my method\_missing fine.

-from acts\_as\_option\_record.rb  
module ActsAsOptionRecord  
def self.included(base)  
base.extend ClassMethods  
base.extend InstanceMethods  
end

module ClassMethods  
def acts\_as\_option\_record  
include ActsAsOptionRecord::InstanceMethods  
extend ActsAsOptionRecord::ClassMethods  
end

end

module InstanceMethods

```
def update_attributes (arguments)
  debugger
  #stuff
end

def valid?
  debugger
  #more stuff
end

```

end  
end

-from init.rb  
ActiveRecord::Base.send(:include, ActsAsOptionRecord)

---

<div class="post-metadata">

**Author:** ![n3rdgir1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/7cd45c/32.png) [@n3rdgir1](https://www.ruby-forum.com/u/n3rdgir1)\
**Post date:** [June 12, 2009, 4:27am UTC](https://www.ruby-forum.com/t/overrite-activerecord-methods-in-plugin/170074/2 "2009-06-12T04:27:50Z")

</div>

Never ever override basic methods, if you want to do this, what you  
really need is alias\_method\_chain 🙂

Imagine that you want to do some logging before and after calling the  
:update\_attributes method, here’s how it would look like:

module ActsAsLoggable

```
def self.included( base )

    base.send( :include, InstanceMethods )
    base.alias_method_chain :update_attributes, :acts_as_loggable

end

module InstanceMethods

    def update_attributes_with_acts_as_loggable( attributes )
        puts "before update attributes"
        self.update_attributes_without_acts_as_loggable( attributes 

```

)  
puts “after update attributes”  
end

```
end

```

end

- 

Maurício Linhares  
[http://codeshooter.wordpress.com/](http://codeshooter.wordpress.com/) | [http://twitter.com/mauriciojr](http://twitter.com/mauriciojr)

On Thu, Jun 11, 2009 at 7:05 PM, Helena

---

<div class="post-metadata">

**Author:** ![n3rdgir1](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/n/7cd45c/32.png) [@n3rdgir1](https://www.ruby-forum.com/u/n3rdgir1)\
**Post date:** [June 12, 2009, 4:30pm UTC](https://www.ruby-forum.com/t/overrite-activerecord-methods-in-plugin/170074/3 "2009-06-12T16:30:32Z")

</div>

Thanks, that’s working great.

I did have to put the alias method in my ClassMethod definition of  
acts\_as\_option\_record to get it to load correctly for my use.

module ClassMethods  
def acts\_as\_option\_record  
include ActsAsOptionRecord::InstanceMethods  
extend ActsAsOptionRecord::ClassMethods  
alias\_method\_chain :update\_attributes, :option\_record  
end

end
