Need some basic help with on-the-run model extension

Hi all

I want to create a method that - when called in a model definition -
adds some more methods to this model.

def MyModel < ActiveRecord::Base
add_some_methods # This should add some methods
end

So I began with the following code…

def ActiveRecord::Base
private
def self.add_some_methods
# Add some methods…
end
end

But now I don’t know how I can add those methods in the add_some_method
method. Any help is highly appreciated. :slight_smile:
Ah yeah, and by the way: how can I determine the actual model’s class
name in the add_some_methods method?

Thanks a lot
Josh

Thanks a lot, this was very helpful. :slight_smile:

On 10/22/07, Joshua M. [email protected] wrote:

So I began with the following code…

def ActiveRecord::Base
private
def self.add_some_methods
# Add some methods…
end
end

But now I don’t know how I can add those methods in the add_some_method
method. Any help is highly appreciated. :slight_smile:

Several ways:

class ActiveRecord::Base
private
def self.add_some_methods
# using define method
define_method(:new_meth1) {|arg| #code for method body here}
# using class_eval
class_eval(<<-HERE
def new_meth2(arg)
# Code for new_meth2
end
HERE
end
end

You might want to check out Module#alias_method_chain which is added
by ActiveSupport, this is the idiomatic way to add extensions to
existing methods. Lets’ say you wanted to extend
ActiveRecord::Base#find with some new feature called foo. You’d do
something like this inside your add_some_methods method

alias_method_chain :find, :foo

and define your extension method as :find_with_foo, you can get at the
original find method by calling :find_without_foo since the alias
method chain expands to:

 alias_method :find_without_foo, :find
 alias_method :find, :find_with_foo

Ah yeah, and by the way: how can I determine the actual model’s class
name in the add_some_methods method?

Just invoke the Module#name method in your class method, either
with self or no receiver.


Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/