¿Cómo llamo a una clase desde una cadena que contiene ese nombre de clase dentro de ella? (Supongo que podría hacer caso / cuándo, pero eso parece feo).
La razón por la que pregunto es porque estoy usando el acts_as_commentable
complemento, entre otros, y estos almacenan commentable_type como una columna. Quiero poder llamar a cualquier clase comentable en particular para hacer un comentario find(commentable_id)
.
Gracias.
ruby-on-rails
sin clasificar
fuente
fuente
Module.const_get
. La ventaja deconstantize
es que funciona incluso con espacios de nombres profundamente anidados, por lo que podría hacer'Functional::Collections::LazyList'.constantize
y obtener la clase LazyList del módulo Colecciones en el módulo Funcional, mientras que conconst_get
, tendría que hacer algo como'Functional::Collections::LazyList'.split('::').reduce(Module, :const_get)
."Object".constantize # => Object
fuente
.constantize
es un método Rails, no lo encontrará en Ruby simpleDada una cadena, primero llame a classify para crear un nombre de clase (sigue siendo una cadena), luego llame a constantize para intentar encontrar y devolver la constante de nombre de clase (tenga en cuenta que los nombres de clase son constantes ).
some_string.classify.constantize
fuente
Sé que esta es una pregunta antigua, pero solo quiero dejar esta nota, puede ser útil para otros.
En Ruby simple,
Module.const_get
puede encontrar constantes anidadas. Por ejemplo, tener la siguiente estructura:module MyModule module MySubmodule class MyModel end end end
Puede usarlo de la siguiente manera:
Module.const_get("MyModule::MySubmodule::MyModel") MyModule.const_get("MySubmodule") MyModule::MySubmodule.const_get("MyModel")
fuente
Cuando ActiveSupport está disponible (por ejemplo, en Rails):
String#constantize
oString#safe_constantize
, eso es"ClassName".constantize
.En Ruby puro:,
Module#const_get
típicamenteObject.const_get("ClassName")
.En rubíes recientes, ambos funcionan con constantes anidadas en módulos, como en
Object.const_get("Outer::Inner")
.fuente
Si desea convertir la cadena al nombre de la clase actual para acceder al modelo o cualquier otra clase
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`
fuente