2012-04-26 9 views
21

Utilicé ActiveRecord::Base.set_table_name para establecer el nombre de mi tabla en una clase ActiveRecord creada dinámicamente. Ahora necesito saber cómo obtener ese valor más tarde. Los documentos de API no mencionan nada sobre cómo hacer esto. Además, no puedo derivar el nombre de la tabla del nombre de la clase ActiveRecord porque están codificados de forma diferente que el nombre de la tabla.Obtener el nombre de la tabla de ActiveRecord

Aquí es un mejor ejemplo de lo que estoy haciendo

table_klass = Class.new(ActiveRecord::Base) 
    ActiveRecord::Base.const_set(const_name,table_klass) 
    app = @app 
    table_klass.class_eval do 
     after_save do 
     @@channel.push self 
     end 
     set_table_name t.server_table 
     establish_connection(
     :adapter => "mysql2", 
     :host  => app.db_host, 
     :username => app.db_user, 
     :password => app.db_pass, 
     :database => app.db_name 
    ) 
    end 

En este caso, si el const_name = Prueba y el nombre de base de datos es la base de datos se debe crear una clase de ActiveRecord :: Base :: DatabaseTest, lo cual hace Pero cuando llamo a table_name, obtengo una variable o método local indefinido. ¿Debo llamar a table_name en la clase?

Actualización: Lo tengo trabajo llamando instance.class.table_name

Respuesta

30

¿Ha intentado table_name? Docs.

+0

He intentado esto, se dice que el método no definido. Debería estar un poco más claro. Estoy metaprogramando la creación de esta clase. Estoy agregando un ejemplo más claro a mi pregunta – MobileOverlord

+0

Ah, lo siento, estoy un poco fuera de mi profundidad con tanto meta. Todo lo que puedo decir es que 'table_name' es un método de clase en' ActiveRecord :: Base' (y de ahí sus clases derivadas), obtenido de 'ActiveRecord :: ModelSchema :: ClassMethods'. – Chowlett

7
class User < ActiveRecord::Base 
end 

User.table_name 
# 'users' 
1

Creo que no hay forma más elegante, pero la solución más simple es eval

my_class_name = "MyNewARClass" 
my_class_table_name = "MyDatabase" 
eval %{ 
    class #{my_class_name} < ActiveRecord::Base 
     self.table_name = "#{my_class_table_name}" 

    end 
    } 
9

tarde a la fiesta.

He utilizado el siguiente código de rieles:

my_record = Record.id(0) # hypothetical code 
table_name = my_record.class.table_name 
+0

tarde, pero está funcionando! –

+0

¿por qué no simplemente 'Record.table_name' como otras respuestas sugeridas? :pulgar hacia abajo: – akostadinov

Cuestiones relacionadas