¿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_commentablecomplemento, 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 deconstantizees que funciona incluso con espacios de nombres profundamente anidados, por lo que podría hacer'Functional::Collections::LazyList'.constantizey 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 # => Objectfuente
.constantizees 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.constantizefuente
Sé que esta es una pregunta antigua, pero solo quiero dejar esta nota, puede ser útil para otros.
En Ruby simple,
Module.const_getpuede encontrar constantes anidadas. Por ejemplo, tener la siguiente estructura:module MyModule module MySubmodule class MyModel end end endPuede 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#constantizeoString#safe_constantize, eso es"ClassName".constantize.En Ruby puro:,
Module#const_gettí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