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.
Several ways:
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...
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.