2012-04-26 24 views
21

Ich habe ActiveRecord::Base.set_table_name verwendet, um meinen Tabellennamen für eine dynamisch erstellte ActiveRecord-Klasse festzulegen. Jetzt muss ich wissen, wie ich diesen Wert später bekomme. Die API-Dokumente erwähnen nichts darüber, wie dies zu tun ist. Außerdem kann ich den Tabellenname nicht vom ActiveRecord-Klassennamen ableiten, da sie anders als der Tabellenname codiert sind.Abrufen des Tabellennamens von ActiveRecord

Hier ist ein besseres Beispiel dafür, was ich

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 

In diesem Fall täte, wenn der const_name = Test und der Name der Datenbank Datenbank ist es eine Klasse von Activerecord :: Base :: DatabaseTest schaffen sollte, was es macht. Aber wenn ich table_name darauf anrufe, erhalte ich eine undefinierte lokale Variable oder Methode. Muss ich table_name für die Klasse aufrufen?

Update: ich es von instance.class.table_name

Antwort

30

Aufruf Arbeit bekam Haben Sie table_name versucht? Docs.

+0

ich dies versucht haben, sagt es nicht definierte Methode. Ich sollte ein wenig klarer sein. Ich habe die Erstellung dieser Klasse metaprogrammiert. Ich füge ein klareres Beispiel zu meiner Frage hinzu – MobileOverlord

+0

Ah, tut mir leid, ich bin ein wenig überfordert mit so viel Meta. Alles, was ich Ihnen sagen kann, ist, dass 'table_name' eine Klassenmethode für' ActiveRecord :: Base' ist (und damit auch für die abgeleiteten Klassen), die aus 'ActiveRecord :: ModelSchema :: ClassMethods' gewonnen wurde. – Chowlett

7
class User < ActiveRecord::Base 
end 

User.table_name 
# 'users' 
1

Ich denke, es eleganter Weg, aber die einfachste Lösung ist 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

spät zur Party.

benutzte ich die folgenden Schienen Code:

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

Spät, aber es funktioniert! –

+0

warum nicht nur 'Record.table_name' als andere Antworten vorgeschlagen? :Daumen runter: – akostadinov

Verwandte Themen