ruby将string类名转换为实际的类
如何从包含该类名称的string中调用一个类? (我想我可以做案例/但是看起来很丑陋。)
我问的原因是因为我正在使用acts_as_commentable
插件等等,并且这些将commentable_type存储为列。 我希望能够调用任何特殊的可评论的类来做一个find(commentable_id)
就可以了。
谢谢。
我想你想要的是constantize
这是一个RoR构造。 我不知道是否有一个ruby核心
"Object".constantize # => Object
给定一个string,首先调用classify来创build一个类名(仍然是一个string),然后调用constantize来试图find并返回类名constant(注意类名是常量 )。
some_string.classify.constantize
我知道这是一个老问题,但我只是想留下这个笔记,这可能对别人有帮助。
在普通的Ruby中, Module.const_get
可以find嵌套的常量。 例如,具有以下结构:
module MyModule module MySubmodule class MyModel end end end
你可以使用它如下:
Module.const_get("MyModule::MySubmodule::MyModel") MyModule.const_get("MySubmodule") MyModule::MySubmodule.const_get("MyModel")
如果你想将string转换为真正的类名来访问模型或任何其他类
str = "group class" > str.camelize.constantize 'or' > str.classify.constantize 'or' > str.titleize.constantize Example : def call_me(str) str.titleize.gsub(" ","").constantize.all end Call method : call_me("group class") Result: GroupClass Load (0.7ms) SELECT `group_classes`.* FROM `group_classes`
当ActiveSupport可用时(例如在Rails中): String#constantize
或String#safe_constantize
,即"ClassName".constantize
。
在纯Ruby中: Module#const_get
,通常是Object.const_get("ClassName")
。
在最近的ruby中,都使用嵌套在模块中的常量,如Object.const_get("Outer::Inner")
。