Получить класс по имени в Ruby - PullRequest
2 голосов
/ 08 марта 2012

У меня есть два класса

class ClassOne
    def do_something
      [...]
    end
end

class ClassTwo
    def do_something
      [...]
    end
end

Я получаю имя класса (ClassOne или ClassTwo) из базы данных, и я хочу вызвать do_something в этом классе

, поэтому яесть

class_name = "ClassOne"

, и я хочу вызвать ClassOne.do_something или ClassTwo.do_something, если имя_класса равно "ClassTwo".

Я не могу сделать это с помощью простого условия, яУ меня много классов, и я проверяю, существует ли класс перед вызовом ..

Есть ли способ сделать это?

Ответы [ 3 ]

6 голосов
/ 08 марта 2012

Для ванильного рубина:

Kernel.const_get('ClassOne').do_something

Для рельсов:

'ClassOne'.constantize.do_something
2 голосов
/ 08 марта 2012

Хотя вы можете преобразовать любую произвольную строку в класс, используя constantize из ActiveSupport, если он доступен, это может привести к исключениям, если пользователи могут отправить соответствующую строку.Может быть безопаснее использовать case:

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

То же самое может быть достигнуто с помощью Hash или Array, определяющих допустимые классы и тестирующих либо с [], либо с include? соответственно.

0 голосов
/ 08 марта 2012

eval("#{classname}.do_something")

Примечание: вы должны изменить свой код на def self.do_something, иначе это методы экземпляра. Похоже, это ваше намерение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...