2016-01-08 84 views
0

我需要找到兩個類之間的連接表的名稱,例如Client和Language。我需要能夠以編程方式執行此操作,因爲我正在生成一個複雜的SQL查詢,該查詢必須自動解釋新的關係。如何獲取ActiveRecord關聯中的連接表名稱?

我的最好的辦法是使用兩個班表名和聯接表命名約定將它們組合起來:

if Client.table_name < Language.table_name 
    Client.table_name + '_' + Language.table_name 
else 
    Language.table_name + '_' + Client.table_name 
end 

然而,這並不佔自定義連接表的名稱。有沒有辦法獲得實際的連接表名稱?

+0

您的代碼有點問題,因爲連接表名稱來自類名稱,而不是來自表名稱。你可以有一個類爲'self.table_name ='users''的類客戶端,所以當實際上默認的連接表是'clients_languages'時,你得到的表名是'languages_users'。更好的是'Client.to_s.tableize' – SteveTurczyn

+0

另外請注意,Rails 4改變了多個單詞和共同起始單詞的連接表的命名約定... ContractType和ContractPlan連接表將是'contract_plans_types' http:// ruby​​- journal.com/rails-4-changes-join-table-naming-convention/ – SteveTurczyn

+0

@SteveTurczyn這正是我想要查找的原因,如果有一種現有的方法提供生成或自定義連接表名稱而無需知道哪個是哪個。幸運的是,下面的答案幫助我找到了這樣一種方法。 –

回答

0

如果有一個自定義的連接表,你可以如下檢索...

Client.new.association(:languages).options[:join_table] 
+0

謝謝!這個答案讓我在ActiveRecord反射類中找到了一個join_table方法(去圖),它提供了正確的名稱,無論是默認還是自定義! –

+0

很酷。你應該爲自己發佈一個答案,使這個問題更有用。我會查看它。 – SteveTurczyn

0

所以,看來有句話說得,返回由創建的連接表的準確名稱的方法ActiveRecord遷移。從邏輯上講,在生成表格時必須有一個提供名稱,不是嗎? 因此,ActiveRecord的AssociationReflection類確實有一個「join_table」方法,該方法返回聲明的表名(如果存在),否則返回派生的名稱。

該類定義中有一些非常有趣的前瞻性方法。這很值得一看。

相關問題