Как мне вызвать класс из строки, содержащей это имя класса внутри него? (Думаю, я мог бы сделать случай / когда, но это кажется уродливым.)
Причина, по которой я спрашиваю, заключается в том, что я использую acts_as_commentable
, среди прочего, плагин, и они хранят commentable_type в виде столбца. Я хочу иметь возможность вызывать любой конкретный комментируемый класс, чтобы сделать с find(commentable_id)
ним что-то.
Спасибо.
ruby-on-rails
несортированный
источник
источник
Module.const_get
. Преимуществоconstantize
заключается в том, что он работает даже с глубоко вложенными пространствами имен, поэтому вы можете сделать'Functional::Collections::LazyList'.constantize
и получить класс LazyList из модуля Collections в модуле Functional, тогда как с помощьюconst_get
вам нужно будет сделать что-то вроде'Functional::Collections::LazyList'.split('::').reduce(Module, :const_get)
."Object".constantize # => Object
источник
.constantize
это метод Rails, вы не найдете его в простом RubyДля данной строки сначала вызовите 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")
источник
Когда ActiveSupport доступен (например, в Rails):
String#constantize
илиString#safe_constantize
, что есть"ClassName".constantize
.В чистом Ruby:
Module#const_get
обычноObject.const_get("ClassName")
.В последних версиях Ruby оба работают с константами, вложенными в модули, например в
Object.const_get("Outer::Inner")
.источник
Если вы хотите преобразовать строку в актуальное имя класса для доступа к модели или любому другому классу
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`
источник