¿Cómo obtengo el nombre de una clase Ruby?


392

¿Cómo puedo obtener el nombre de la clase de un objeto ActiveRecord?

Yo tengo:

result = User.find(1)

Lo intenté:

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

Solo necesito el nombre de la clase, en una cadena ( Useren este caso). ¿Hay algún método para eso?

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


1
@Oliver N .: Con objetos Ruby normales, Object#class.inspectda lo mismo que Object#class.name, mientras que este no es el caso con los objetos ActiveRecord.
Andrew Grimm

Respuestas:


732

Desea llamar a .name en la clase del objeto:

result.class.name

44
Cuando hago esto, obtengo los nombres de los Módulos antes, así que "Módulo :: SubMódulo :: Clase", ¿hay alguna forma de obtener solo "Clase"
Abe Petrillo

25
@Abe:result.class.name.split('::').last
Daniel Rikowski

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

2
Para los recién llegados por ahí, también se puede obtener el nombre de la clase como una cadena mediante la clase de la siguiente manera: User.name. User.to_sTambién parece funcionar.
Dan Polites el

El método de demodulización proviene de aquí: apidock.com/rails/ActiveSupport/Inflector/demodulize (debe cargar las inflexiones de cadena de ActiveSupport para poder usar si, si no es un proyecto de Rails).
Por Lundberg

118

Aquí está la respuesta correcta, extraída de los comentarios de Daniel Rikowski y pseidemann. Estoy cansado de tener que revisar los comentarios para encontrar la respuesta correcta ...

Si usa Rails (ActiveSupport):

result.class.name.demodulize

Si usa POR (plain-ol-Ruby):

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

34

Ambos result.class.to_sy result.class.nametrabajo.


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

7

Si desea obtener un nombre de clase desde un método de clase, class.nameo self.class.nameno funcionará. Estos solo saldrán Class, ya que la clase de una clase es Class. En cambio, puedes usar name:

module Foo
  class Bar
    def self.say_name
      puts "I'm a #{name}!"
    end
  end
end

Foo::Bar.say_name

salida:

I'm a Foo::Bar!

3

En mi caso, cuando uso algo así result.class.name, tengo algo así Module1::class_name. Pero si solo queremos class_name, use

result.class.table_name.singularize

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.