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

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

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 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

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