在Ruby中按名称获取类

时间:2012-03-08 15:41:08

标签: ruby

我有两个班级

class ClassOne
    def do_something
      [...]
    end
end

class ClassTwo
    def do_something
      [...]
    end
end

我从数据库中获取了一个类名(ClassOne或ClassTwo),我想在该类中调用do_something

所以我有

class_name = "ClassOne"

如果class_name等于“ClassTwo”,我想调用ClassOne.do_somethingClassTwo.do_something

我不能使用简单的if条件,我有很多类,并且在调用之前检查类是否存在..

有办法吗?

3 个答案:

答案 0 :(得分:6)

对于香草红宝石:

Kernel.const_get('ClassOne').do_something

对于Rails:

'ClassOne'.constantize.do_something

答案 1 :(得分:2)

虽然您可以使用ActiveSupport中的constantize将任意字符串转换为类(如果可用),但如果用户可以提交相关字符串,则可能会导致异常。使用case

可能更安全
case (with_class)
when 'ClassOne', 'ClassTwo'
  with_class.constantize.do_something
else
  raise "Um, what are you doing?"
end

使用哈希或数组定义有效类并相应地使用[]include?进行测试,可以实现同样的目的。

答案 2 :(得分:-1)

eval("#{classname}.do_something")

注意:您必须将代码更改为def self.do_something,否则这些是实例方法。看起来这是你的意图。