ruby конвертирует имя класса в строке в реальный класс - PullRequest
80 голосов
/ 12 августа 2010

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

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

Спасибо.

Ответы [ 6 ]

114 голосов
/ 12 августа 2010

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

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

42 голосов
/ 12 августа 2010
"Object".constantize # => Object
28 голосов
/ 28 марта 2012

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

some_string.classify.constantize
16 голосов
/ 01 июля 2016

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

В простом 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")
6 голосов
/ 15 апреля 2015

Если вы хотите преобразовать строку в действительное имя класса для доступа к модели или любому другому классу

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`
5 голосов
/ 16 февраля 2016

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

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

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

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