# How to add a method\_missing method into ActiveRecord

**URL:** <https://www.ruby-forum.com/t/how-to-add-a-method-missing-method-into-activerecord/79193>\
**Category:** Ruby\
**Created:** [December 13, 2006, 3:03am UTC](https://www.ruby-forum.com/t/how-to-add-a-method-missing-method-into-activerecord/79193 "2006-12-13T03:03:27Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![ao\_tianlong](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c89c15/32.png) [@ao\_tianlong](https://www.ruby-forum.com/u/ao_tianlong)\
**Post date:** [December 13, 2006, 3:03am UTC](https://www.ruby-forum.com/t/how-to-add-a-method-missing-method-into-activerecord/79193/1 "2006-12-13T03:03:27Z")

</div>

i want to write a plugin  
that support like following

Book.search\_by\_author\_and\_description(keyword)

i must hold method\_missing to dynamic find books

but ActiveRecord already used method\_missing .

how can i add onother method\_misng method ?

---

<div class="post-metadata">

**Author:** ![ao\_tianlong](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c89c15/32.png) [@ao\_tianlong](https://www.ruby-forum.com/u/ao_tianlong)\
**Post date:** [December 13, 2006, 6:03am UTC](https://www.ruby-forum.com/t/how-to-add-a-method-missing-method-into-activerecord/79193/2 "2006-12-13T06:03:40Z")

</div>

I believe you can alias the original method\_missing, and then add a  
new method\_missing which calls the original except when your version  
is relevant. it would look something like this:

alias :original\_method\_missing :method\_missing

def method\_missing(\*args)  
case args  
when /normal stuff/  
original\_method\_missing(args)  
when /new stuff/  
# your code goes here  
end  
end

(please bear in mind this is just a sketch.)

–  
Giles B.  
[http://www.gilesgoatboy.org](http://www.gilesgoatboy.org)

> **[Giles Bowkett](http://gilesbowkett.blogspot.com)**
>
> half-disavowed old blog. new blog at gilesbowkett.com

[http://gilesgoatboy.blogspot.com](http://gilesgoatboy.blogspot.com)

---

<div class="post-metadata">

**Author:** ![ao\_tianlong](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c89c15/32.png) [@ao\_tianlong](https://www.ruby-forum.com/u/ao_tianlong)\
**Post date:** [December 13, 2006, 6:15am UTC](https://www.ruby-forum.com/t/how-to-add-a-method-missing-method-into-activerecord/79193/3 "2006-12-13T06:15:41Z")

</div>

What Giles said, except:  
when /new stuff/: #your code  
else original\_method\_missing(\*args,&blk)  
Probably makes more sense.

---

<div class="post-metadata">

**Author:** ![ao\_tianlong](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c89c15/32.png) [@ao\_tianlong](https://www.ruby-forum.com/u/ao_tianlong)\
**Post date:** [December 13, 2006, 8:31am UTC](https://www.ruby-forum.com/t/how-to-add-a-method-missing-method-into-activerecord/79193/4 "2006-12-13T08:31:44Z")

</div>

On 13 Dec 2006, at 14:47, ao tianlong wrote:

> 11 end  
> missingmy method missintest.rb:9:in `method_missing': stack level too deep (SystemStackError) from test.rb:9:in`method\_missing’  
> from test.rb:14
> 
> any idia?

You are calling a missing method from within your new method\_missing.  
Infinite recursion ensues.

The following seems to work:

irb(main):001:0\> class Book  
irb(main):002:1\> def method\_missing(mtd,\*arg,&blk)  
irb(main):003:2\> puts “Original”  
irb(main):004:2\> end  
irb(main):005:1\> alias :original :method\_missing  
irb(main):006:1\> def method\_missing(mtd,\*arg,&blk)  
irb(main):007:2\> puts “New”  
irb(main):008:2\> original(mtd,\*arg,&blk)  
irb(main):009:2\> end  
irb(main):010:1\> end  
=\> nil  
irb(main):011:0\> Book.new.test  
New  
Original  
=\> nil

Alex G.

Bioinformatics Center  
Kyoto University

---

<div class="post-metadata">

**Author:** ![ao\_tianlong](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c89c15/32.png) [@ao\_tianlong](https://www.ruby-forum.com/u/ao_tianlong)\
**Post date:** [December 13, 2006, 8:55am UTC](https://www.ruby-forum.com/t/how-to-add-a-method-missing-method-into-activerecord/79193/5 "2006-12-13T08:55:45Z")

</div>

thank you

i find the error

original\_method\_missing(method\_id,\*prams,&block)

it’s misspelled \*params as prams

thank you again.

---

<div class="post-metadata">

**Author:** ![ao\_tianlong](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c89c15/32.png) [@ao\_tianlong](https://www.ruby-forum.com/u/ao_tianlong)\
**Post date:** [December 13, 2006, 6:47am UTC](https://www.ruby-forum.com/t/how-to-add-a-method-missing-method-into-activerecord/79193/6 "2006-12-13T06:47:43Z")

</div>

1 class Book  
2 def method\_missing(method\_id,\*params,&block)  
3 print ‘original method missing’  
4 end  
5  
6 alias :original\_method\_missing :method\_missing  
7 def method\_missing(method\_id,\*params,&block)  
8 C(params[:comment])print ‘my method missing’  
9 original\_method\_missing(method\_id,\*prams,&block)  
10 end  
11 end  
12  
13 book = Book.new  
14 book.tester

its looks like work , but output is  
thod missingmy method missingmy method missingmy method missingmy method  
missingmy method missingmy method missingmy method missingmy method  
missingmy method missingmy method missingmy method missingmy method  
missingmy method missingmy method missingmy method missingmy method  
missingmy method missintest.rb:9:in `method_missing': stack level too deep (SystemStackError) from test.rb:9:in`method\_missing’  
from test.rb:14

any idia?

thank you for your help

---

<div class="post-metadata">

**Author:** ![ao\_tianlong](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c89c15/32.png) [@ao\_tianlong](https://www.ruby-forum.com/u/ao_tianlong)\
**Post date:** [December 13, 2006, 8:45pm UTC](https://www.ruby-forum.com/t/how-to-add-a-method-missing-method-into-activerecord/79193/7 "2006-12-13T20:45:25Z")

</div>

ao tianlong wrote:

> i want to write a plugin  
> that support like following
> 
> Book.search\_by\_author\_and\_description(keyword)  
> i must hold method\_missing to dynamic find books  
> but ActiveRecord already used method\_missing .  
> how can i add onother method\_misng method ?

You could alias the existing method\_missing, redefine it to capture the  
cases you are interested in and forward the rest on to the aliased  
method. Check out Module#alias\_method\_chain in Rails 1.2:

> **[New in Rails: Module#alias\_method\_chain](https://rubyonrails.org/2006/4/26/new-in-rails-module-alias_method_chain)**
>
> Though not an outward facing feature, changeset 4276 introduces a nice method to DRY up and encapsulate the common pattern of aliasing a method so that you can build behavior on top of it.All over the internals of Rails you’ll find code like this in...

Tom
