Soft-coding model names?

Hello.

I am trying to “soft-code” the model names in my app so I can use a
generic method call to achieve some results. Many of my modules have
the the following method:

def ModelName.get_array

same code goes here for every module and it returns an array.

end

Is there a way to replace the model name with a variable or something
else in such a way that the method can be called in a generic way?
Something like:

my_array = @model_name.get_array

Thanks.

Pepe

On Tue, Jul 29, 2008 at 7:49 AM, pepe [email protected] wrote:

Is there a way to replace the model name with a variable or something
else in such a way that the method can be called in a generic way?
Something like:

my_array = @model_name.get_array

Take a look at constantize:
http://api.rubyonrails.com/classes/ActiveSupport/CoreExtensions/String/Inflections.html#M000488

You should be able to do something like this
@model_name.constantize.get_array

This might be better written as class level methods then and mixed at
the class level. Here’s an example of how that would work:

module Foo
def self.included(base)
base.extend ClassLevelMethods
end

You can still just define instance level methods as normal

def bar
# …
end

But now these methods will be mixed in at the class level

module ClassLevelMethods
def baz
# …
end
end
end

and just include Foo as normal. HTH

RSL

Thanks Russell. I understand (or almost) what you have in mind. It
would probably be the the ‘right’ way to do it. I’ll play with it and
see what I can come up with.

Thanks a lot.

Pepe

Thanks for the tip. I have tried ‘constantize’ with variables and it
worked like a charm. I’ll try it with my models and see how it works.

Do you know how to do something similar with variables? I have a page
with a table of 31 rows and all the field names follow the format
‘field_namexx’ where ‘xx’ is a sequence number. I have tried
constantize with regular variables but it only works with…
constants! Go figure! :slight_smile:

Thanks a lot.

Pepe