ruby将字符串中的类名转换为实际类

时间:2010-08-12 01:05:28

标签: ruby-on-rails

如何从包含该类名的字符串中调用类? (我想我可以做案例/什么时候,但这看起来很难看。)

我问的原因是因为我正在使用acts_as_commentable插件等,这些插件将commentable_type存储为列。我希望能够调用任何特定的可评论类来对其进行find(commentable_id)

感谢。

6 个答案:

答案 0 :(得分:114)

我认为你想要的是constantize

这是一个RoR构造。我不知道是否有一个红宝石核心

答案 1 :(得分:41)

"Object".constantize # => Object

答案 2 :(得分:28)

给定一个字符串,首先调用classify来创建一个类名(仍然是一个字符串),然后调用constantize来尝试查找并返回类名常量(注意class names are constants )。

some_string.classify.constantize

答案 3 :(得分:15)

我知道这是一个老问题,但我只是想留下这个说明,这可能对其他人有帮助。

在纯Ruby中,Module.const_get可以找到嵌套常量。例如,具有以下结构:

module MyModule
  module MySubmodule
    class MyModel
    end
  end
end

您可以按如下方式使用它:

Module.const_get("MyModule::MySubmodule::MyModel")
MyModule.const_get("MySubmodule")
MyModule::MySubmodule.const_get("MyModel")

答案 4 :(得分:5)

如果要将字符串转换为实际的类名来访问模型或任何其他类

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`

答案 5 :(得分:5)

当ActiveSupport可用时(例如在Rails中):String#constantizeString#safe_constantize,即"ClassName".constantize

纯Ruby:Module#const_get,通常为Object.const_get("ClassName")

在最近的红宝石中,两者都使用嵌套在模块中的常量,例如Object.const_get("Outer::Inner")

相关问题