Forum: Ruby Using a result as a constant object?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Phy P. (Guest)
on 2008-10-19 01:13
(Received via mailing list)
Hello,

I am trying to understand how I can use a return from a method as a
constant name for a class.  What I am trying to do is take a return I
find in a db table and use that name as a class name so that I can use
activerecord.  I admit my understanding of ActiveRecord is extremely
immature so perhaps I am using it wrong.
...
perMatrtix = subMatrix.find[:space].to.upcase

class perMatrix < ActiveRecord::Base; end

blah, blah, blah...

So the return of the find, which is a name (turn to upper) as the name
of a class so that I can access that table within the database.

Any help is greatly appreciated!  Cheers,
Phy
Tim H. (Guest)
on 2008-10-19 01:55
(Received via mailing list)
Phy P. wrote:
> So the return of the find, which is a name (turn to upper) as the name of a class so 
that I can access that table within the database.
>

If you're getting the class name at run-time how would you write code
that uses class after you've created it? I mean, you can't type the
class name into your program now, you don't know what it is?

I suspect that what you really want to do is simply create a class and
assign the result to a variable. Check out Class.new.

my_class = Class.new(ActiveRecord::Base)
my_inst = my_class.new
Artem V. (Guest)
on 2008-10-19 12:29
(Received via mailing list)
2008/10/19 Tim H. <removed_email_address@domain.invalid>:
>> perMatrtix = subMatrix.find[:space].to.upcase
> uses class after you've created it? I mean, you can't type the class name
>
> --
> RMagick: http://rmagick.rubyforge.org/
>
>

  my_class = Class.new(ActiveRecord::Base) {  set_table_name
subMatrix.find[:space].underscore.pluralize  }
  my_inst = my_class.new

Artem

PS:
Expression  "subMatrix.find[:space]" seems strange for me. What is it
about?
Sjoerd A. (Guest)
on 2008-10-19 14:05
If the ActiveRecord model already exists you can just call constantize
on the string containing the model name:

class SomeModel < ActiveRecord::Base; end

model_name = "SomeModel" # or in your case fetch this from a database
ar_model = model_name.constantize
ar.model.find(120)
Sjoerd A. (Guest)
on 2008-10-19 14:06
Sjoerd A. wrote:
> ar.model.find(120)
Should be: ar_model.find(120)
Sjoerd A. (Guest)
on 2008-10-19 14:09
Sjoerd A. wrote:
> Sjoerd A. wrote:
>> ar.model.find(120)
> Should be: ar_model.find(120)

Be aware that 'constantize' is a method added by ActiveSupport, no
problem if you're using Rails, but you need to require it manually
otherwise.
Brian C. (Guest)
on 2008-10-19 21:04
Phy P. wrote:
> I am trying to understand how I can use a return from a method as a
> constant name for a class.

def get_name
  "Foo"
end

n = get_name
c = Class.new(ActiveRecord::Base)   # superclass
Object.const_set(n, c)
Phy P. (Guest)
on 2008-10-19 22:22
(Received via mailing list)
Brian,

Ah, I see now (said the blind man)!  This cool!  Thanks for the example,
much appreciated!

Cheers,
Phy
Phy P. (Guest)
on 2008-10-19 22:23
(Received via mailing list)
Sjoerd,

Thanks much for the clarification.  Indeed this works well.  Appreciate
the help!

Cheers,
Phy
Phy P. (Guest)
on 2008-10-19 22:32
(Received via mailing list)
Artem,

Thank you much for the example.  This truly helps.  WRT you question,
its a typo and basically its a method that retrieves the various
submatrix of a giant sparse matrix.  I am using a db to organize all the
data so that I can run the calculations simultaneously across several
hundred machines.  The orchestration of data and control flow of
processing I am trying to do in ruby.

Again, thanks for help!
Cheers,
Phy
This topic is locked and can not be replied to.