2013-03-06 94 views
0

給定字符串格式的列名稱(例如「hamburger_id」或「foo_bar_id」),是否有獲取類(或類名稱)的標準方法。在這種情況下,漢堡或FooBar?從id列名稱到類名稱

我能想到的唯一的辦法是這樣的:

column_name[0, column_name.length - 3].camelize.constantize 

我可以假設(或規定),可變列名總是包含有「_id」末,並且對應的級始終存在一個字符串。

如果有人發現它相關或好奇,我可以詳細說明「爲什麼」,但我不想用這樣的細節混淆這個問題。

回答

2

你可以做以下的(一個Post模型的假設傳統Rails的例子的has_many評價模型):

Model.reflect_on_all_associations.select{|a| a.foreign_key == 'column_name'}.first.class_name 

這樣做的好處是,如果你的類名和外鍵不用排隊,它仍然會給出正確的類名。例如,如果您的外鍵是owner_id,但相關的型號實際上命名爲User,則將返回而不是"Owner"

這仍然有點像黑客,但這是因爲它不像Rails那樣基於列名得到這些信息 - 通常你會直接與關聯進行交互(使用reflect_on_association(:foos))。

+0

謝謝!對非常規型號名稱的好的呼叫。 – Adnan 2013-03-07 13:38:52

+0

這是Rails 3.1特有的嗎?我查看了在3.0.7中使用此調用返回的Association對象,並且它們沒有「foreign_key」屬性:\ – Adnan 2013-03-07 15:29:31

+0

我實際上在使用3.2.11 - 我沒有看到任何關於這是最近加入了AssociationReflection,但我無法排除它。 – MrTheWalrus 2013-03-07 23:01:02