Forum: Ruby on Rails AR class names

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.
Ddd11872984864786c14992b99ab4d2d?d=identicon&s=25 Alan Bullock (Guest)
on 2006-04-11 15:35
(Received via mailing list)
hello all, quick question: how can I find out if a given string matches
the
name of an ActiveRecord derived class?

thanks in advance
alan
B45eab4f18aa1bb2a44d6e657531a642?d=identicon&s=25 Alain Ravet (aravet)
on 2006-04-11 16:18
Alan

   > hello all, quick question: how can I find out if a given string
matches
   > the name of an ActiveRecord derived class?

Is
    http://nubyonrails.com/tools/pluralize
what you need?


Alain
5810a1b7743eb2186ca0ea1d0a3469a0?d=identicon&s=25 Stephen Bannasch (Guest)
on 2006-04-11 17:38
(Received via mailing list)
I'd like to use ActiveRecord to access my regular tables in a shared
database using table_name_prefix AND at the same time access a legacy
database with table_name_prefix set to "".  This is not easy because
class variables like table_name_prefix can't be redefined in derived
classes without changing the class variable in the parent class.

I can workaround this problem by using set_table_name in my models
for tables in the shared database like this:

class User < ActiveRecord::Base
   set_table_name "myapp_users"

But now my existing migrations won't work and I have to hack them now
too.

Details are below.

--------details--------

I have two different ActiveRecord connections open and one of them is
to a shared database so I set the following class variable:

   ActiveRecord::Base.table_name_prefix = 'myapp_'

So while I refer to the table 'users' in my code in the database the
table is actually named 'myapp_users'.

However the other connection is to a legacy database and I need to
access the tables in this database without the table_name_prefix.
Here's my model for the legacy connection:

class LegacyUser < ActiveRecord::Base
   set_primary_key "user_id"
   cattr_accessor :table_name_prefix
   @@table_name_prefix = ""
   unless connected?
     establish_connection(
       :adapter => "mysql",
       :host => "database.host.com",
       :username => "rails",
       :password => "*******",
       :database => "legacydb"
     )
   end
end

Unfortunately redefining table_name_prefix as a class variable in the
derived class LegacyUser actually changes the class variable in the
parent class also (ActiveRecord::Base).

Right now I can either connect to a shared database and access all my
tables using the table_name_prefix set properly OR access the legacy
database with table_name_prefix set to "" BUT I can't do both.

If I don't redefine table_name_prefix I get the following error when
accessing LegacyUser:

   Table 'legacydb.myapp_legacy_users' doesn't exist:

If I do redefine table_name_prefix I get the following error when
accessing User:

   Table 'regulardb.users' doesn't exist

Because of course the table name is actually: regulardb.myapp_users.

Here the simple ruby test program I created to determine the
redefinition scope of class variables:

class Klass
   def prefix
     @@prefix
   end
   def prefix=(value)
     @@prefix=value
   end
   def Klass.show(string)
     puts @@prefix + string
   end
end

puts Klass.prefix.object_id

class DerivedKlass < Klass
   def prefix
     @@prefix
   end
   def prefix=(value)
     @@prefix=value
   end
end

puts DerivedKlass.prefix.object_id

Klass.prefix = "123"
Klass.show("abc") # => "123abc"
DerivedKlass.prefix = "789"
DerivedKlass.show("abc")# => "789abc"
Klass.show("abc") # => "789abc"

which produces:

2968188
2968188
123abc
789abc
789abc

I would like to find a way so that the second: Klass.show("abc")
results in "123abc" instead of "789abc".

I'd like to be able to create a class variable that will apply to all
objects made from that class and ALSO create a derived class with a
different class variable that is used in objects created from the
derived class WITHOUT affecting the class variable defined in the
original class.

It isn't obvious to me how to do this using class variables so either
I'm missing something or there is another way to solve this
programming problem.

If this can't be done perhaps I could do something in DerivedKlass so
that any accesses to it's actual or inherited object methods save
Klass.prefix, replace it, and restore it? Of course the restoration
would have to work for both normal program flow and for an error.
This sounds uglier to me.
This topic is locked and can not be replied to.