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


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

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 (User en este caso). ¿Hay algún método para eso?

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

Author: Simone Carletti, 2009-05-05

5 answers

Desea llamar a . name en la clase del objeto:

result.class.name
 638
Author: flicken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-05 18:21:23

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

Si utiliza Rails (ActiveSupport):

result.class.name.demodulize

Si usas POR (plain-ol-Ruby):

result.class.name.split('::').last
 94
Author: Darren Hicks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-18 19:21:09

Ambos result.class.to_s y result.class.name funcionan.

 33
Author: tal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-12 05:45:26

Si desea obtener un nombre de clase desde dentro de un método de clase, class.name o self.class.name no funcionará. Estos solo producirán Class, ya que la clase de una clase es Class. En su lugar, 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!
 2
Author: jayhendren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 20:01:45

En mi caso cuando uso algo como result.class.name tengo algo como Module1::class_name. Pero si solo queremos class_name, usar

result.table_name.singularize

 0
Author: Chivorn Kouch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-06 06:39:13