2009-05-05 20 views
317

¿Cómo puedo obtener el nombre de clase de un objeto ActiveRecord?¿Cómo obtengo el nombre de una clase de Ruby?

que tengo:

result = User.find(1) 

Traté:

result.class 
# => User(id: integer, name: string ...) 
result.to_s 
# => #<User:0x3d07cdc>" 

necesito sólo el nombre de la clase, en una cadena (User en este caso). ¿Hay un método para eso?

Sé que esto es bastante básico, pero busqué los documentos de Rails y Ruby, y no pude encontrarlo.

+1

@Oliver N .: Con los objetos normales de Ruby, objeto '# class.inspect' da lo mismo que' Objeto # class.name', mientras que esto no es el caso con objetos ActiveRecord. –

Respuesta

604

que desea llamar .name en la clase del objeto:

result.class.name 
+3

Cuando hago esto obtengo los nombres del Módulo antes, entonces "Module :: SubModule :: Class", hay una manera de obtener solo "Class" –

+22

@Abe: 'result.class.name.split (':: ') .last' –

+72

@Abe: incluso más limpio (ActiveSupport): 'result.class.name.demodulize' – pseidemann

31

Tanto result.class.to_s y result.class.name trabajo.

+28

Pero conceptualmente, #name devuelve el nombre, #to_s devuelve una representación de cadena, que simplemente resulta ser idéntico al nombre. Me limitaría a usar #name, solo por retención de anal. – kch

87

Aquí está la respuesta correcta, extraída de los comentarios de Daniel Rikowski y pseidemann. Estoy cansado de tener que eliminar a través de los comentarios de encontrar la respuesta correcta ...

Si utiliza rieles (ActiveSupport):

result.class.name.demodulize 

Si utiliza POR (plain-ol-Rubí):

result.class.name.split('::').last 
0

En mi caso cuando uso algo como result.class.name obtuve algo así como Module1::class_name. Pero si sólo queremos class_name, utilice

result.table_name.singularize

Cuestiones relacionadas