Como faço para chamar uma classe de uma string contendo o nome da classe dentro dela? (Eu acho que poderia fazer caso / quando, mas isso parece feio.)
A razão de eu perguntar é porque estou usando o acts_as_commentable
plugin, entre outros, e eles armazenam o commentable_type como uma coluna. Eu quero ser capaz de chamar qualquer classe comentável em particular para fazer umfind(commentable_id)
sobre ela.
Obrigado.
ruby-on-rails
não triados
fonte
fonte
Module.const_get
. A vantagem doconstantize
é que funciona mesmo com namespaces profundamente aninhados, então você pode fazer'Functional::Collections::LazyList'.constantize
e obter a classe LazyList do módulo Coleções no módulo Funcional, enquanto comconst_get
, você teria que fazer algo parecido'Functional::Collections::LazyList'.split('::').reduce(Module, :const_get)
.fonte
.constantize
é um método Rails, você não o encontrará em Ruby simplesDada uma string, primeira chamada classify para criar um nome de classe (ainda uma string) e, em seguida, chame constantize para tentar encontrar e retornar a constante do nome da classe (observe que os nomes das classes são constantes ).
fonte
Eu sei que esta é uma pergunta antiga, mas eu só quero deixar esta nota, pode ser útil para outras pessoas.
Em Ruby simples,
Module.const_get
pode encontrar constantes aninhadas. Por exemplo, tendo a seguinte estrutura:Você pode usá-lo da seguinte maneira:
fonte
Quando ActiveSupport está disponível (por exemplo, em Rails):
String#constantize
ouString#safe_constantize
, isto é"ClassName".constantize
.Em Ruby puro:,
Module#const_get
normalmenteObject.const_get("ClassName")
.Em rubis recentes, ambos trabalham com constantes aninhadas em módulos, como em
Object.const_get("Outer::Inner")
.fonte
Se você deseja converter string em nome de classe atual para acessar o modelo ou qualquer outra classe
fonte