2012-04-26 42 views
21

我用ActiveRecord::Base.set_table_name在動態創建的ActiveRecord類上設置我的表名。現在我需要知道如何在稍後獲得價值。 api文檔沒有提及如何做到這一點。此外,我無法從ActiveRecord類名稱派生表名,因爲它們的鍵名與表名不同。從ActiveRecord獲取表名

下面是我在做什麼

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 

在這種情況下一個更好的例子,如果const_name =測試和數據庫名稱數據庫,應該創建一個類的ActiveRecord :: Base的:: DatabaseTest的,它所做的。但是當我調用table_name時,我得到了未定義的局部變量或方法。我需要在課堂上調用table_name嗎?

更新: 我得到它通過調用instance.class.table_name

回答

30

您是否嘗試過table_name工作? Docs

+0

我曾經嘗試這樣做,它說未定義的方法。我應該更清楚一點。我是元編程這個類的創建。我正在爲我的問題添加一個更清晰的示例 – MobileOverlord 2012-04-26 14:32:10

+0

啊,對不起,我有點偏離了這個多元化的深度。我可以告訴你的是'table_name'是從'ActiveRecord :: ModelSchema :: ClassMethods'獲得的'ActiveRecord :: Base'(因此它的派生類)的一個類方法。 – Chowlett 2012-04-26 14:49:49

7
class User < ActiveRecord::Base 
end 

User.table_name 
# 'users' 
1

我認爲有更優雅的方式,但最簡單的解決方法是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

遲到了。

我用下面的Rails代碼:

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

晚了,但它工作! – 2016-04-10 03:45:41

+0

爲什麼不只是'Record.table_name'建議的其他答案? :拇指向下: – akostadinov 2016-09-19 20:25:06