Ответ 1
Я думаю, что вы хотите constantize
Это конструкция RoR. Я не знаю, есть ли там для рубинового ядра
Как мне вызвать класс из строки, содержащей это имя класса внутри? (Думаю, я мог бы сделать случай/когда, но это кажется уродливым.)
Причина, по которой я спрашиваю, заключается в том, что я использую плагин acts_as_commentable
, среди прочих, и хранят commentable_type в качестве столбца. Я хочу, чтобы иметь возможность вызвать какой-либо отдельный класс комментария, чтобы сделать find(commentable_id)
на нем.
Спасибо.
Я думаю, что вы хотите constantize
Это конструкция RoR. Я не знаю, есть ли там для рубинового ядра
"Object".constantize # => Object
Для строки сначала вызовите classify, чтобы создать имя класса (все еще строку), затем вызовите constantize, чтобы попытаться найти и вернуть константу имени класса (обратите внимание, что имена классов являются константами).
some_string.classify.constantize
Я знаю, что это старый вопрос, но я просто хочу оставить эту заметку, это может быть полезно для других.
В простом 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")
Если вы хотите преобразовать строку в имя класса активации для доступа к модели или любому другому классу
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")
.
В последних рубинах обе работают с константами, вложенными в модули, например, в Object.const_get("Outer::Inner")
.