Как получить имя класса Ruby?

Как получить имя класса из объекта ActiveRecord?

У меня есть:

result = User.find(1)

Я пробовал:

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

Мне нужно только имя класса в строке (User в этом случае). Есть ли способ для этого?

Я знаю, что это довольно просто, но я искал как Rails, так и Ruby docs, и я не смог его найти.

Ответ 1

Вы хотите вызвать .name для класса объекта:

result.class.name

Ответ 2

Вот правильный ответ, извлеченный из комментариев Даниэля Риковски и псевдомана. Я устал от необходимости сорвать комментарии, чтобы найти правильный ответ...

Если вы используете Rails (ActiveSupport):

result.class.name.demodulize

Если вы используете POR (plain-ol-Ruby):

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

Ответ 3

Работают как result.class.to_s, так и result.class.name.

Ответ 4

Если вы хотите получить имя класса из метода класса, class.name или self.class.name не будут работать. Они просто выведут Class, поскольку класс класса - Class. Вместо этого вы можете просто использовать name:

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

Foo::Bar.say_name

выход:

I'm a Foo::Bar!

Ответ 5

В моем случае, когда я использую что-то вроде result.class.name, я получаю что-то вроде Module1::class_name. Но если мы хотим только class_name, используйте

result.class.table_name.singularize