Ruby конвертировать имя класса в строку в фактический класс

Как мне вызвать класс из строки, содержащей это имя класса внутри? (Думаю, я мог бы сделать случай/когда, но это кажется уродливым.)

Причина, по которой я спрашиваю, заключается в том, что я использую плагин acts_as_commentable, среди прочих, и хранят commentable_type в качестве столбца. Я хочу, чтобы иметь возможность вызвать какой-либо отдельный класс комментария, чтобы сделать find(commentable_id) на нем.

Спасибо.

Ответ 1

Я думаю, что вы хотите constantize

Это конструкция RoR. Я не знаю, есть ли там для рубинового ядра

Ответ 2

"Object".constantize # => Object

Ответ 3

Для строки сначала вызовите classify, чтобы создать имя класса (все еще строку), затем вызовите constantize, чтобы попытаться найти и вернуть константу имени класса (обратите внимание, что имена классов являются константами).

some_string.classify.constantize

Ответ 4

Я знаю, что это старый вопрос, но я просто хочу оставить эту заметку, это может быть полезно для других.

В простом 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")

Ответ 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`

Ответ 6

Когда доступна ActiveSupport (например, в Rails): String#constantize или String#safe_constantize, то есть "ClassName".constantize.

В чистом Ruby: Module#const_get, обычно Object.const_get("ClassName").

В последних рубинах обе работают с константами, вложенными в модули, например, в Object.const_get("Outer::Inner").