2013-03-06 87 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