Soft-coding model names?

0 views
Skip to first unread message

pepe

unread,
Jul 29, 2008, 8:49:34 AM7/29/08
to Ruby on Rails: Talk, pe...@betterrpg.com
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

Christopher Kintner

unread,
Jul 29, 2008, 9:17:47 AM7/29/08
to rubyonra...@googlegroups.com

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

> Thanks.
>
> Pepe
> >
>

Russell Norris

unread,
Jul 29, 2008, 11:28:32 AM7/29/08
to rubyonra...@googlegroups.com
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

pepe

unread,
Jul 29, 2008, 11:28:22 PM7/29/08
to Ruby on Rails: Talk
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! :)

Thanks a lot.

Pepe

On Jul 29, 9:17 am, "Christopher Kintner" <kint...@gmail.com> wrote:
> On Tue, Jul 29, 2008 at 7:49 AM, pepe <P...@betterrpg.com> wrote:
>
> > Hello.
>
> > I am trying to "soft-code" the modelnamesin 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 avariableor 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/Strin...

pepe

unread,
Jul 29, 2008, 11:30:14 PM7/29/08
to Ruby on Rails: Talk
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

On Jul 29, 11:28 am, "Russell Norris" <r...@swimcommunity.org> wrote:
> 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
>
> On Tue, Jul 29, 2008 at 9:17 AM, Christopher Kintner <kint...@gmail.com> wrote:
>
> > On Tue, Jul 29, 2008 at 7:49 AM, pepe <P...@betterrpg.com> wrote:
>
> >> Hello.
>
> >> I am trying to "soft-code" the modelnamesin 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 avariableor 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/Strin...
Reply all
Reply to author
Forward
0 new messages