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.
Ah yeah, and by the way: how can I determine the actual model’s class
name in the add_some_methods method?
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:
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: