¿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.

y yo
fuente
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
flicken
fuente
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
Darren Hicks
fuente
34

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

tal
fuente
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!
jayhendren
fuente
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

Chivorn Kouch
fuente