Как я могу получить название класса Ruby? - PullRequest
364 голосов
/ 05 мая 2009

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

У меня есть:

result = User.find(1)

Я пытался:

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

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

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

Ответы [ 5 ]

676 голосов
/ 05 мая 2009

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

result.class.name
103 голосов
/ 18 июля 2014

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

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

result.class.name.demodulize

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

result.class.name.split('::').last
33 голосов
/ 06 мая 2009

Оба result.class.to_s и result.class.name работают.

5 голосов
/ 12 апреля 2018

Если вы хотите получить имя класса из метода класса, 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!
1 голос
/ 06 декабря 2017

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

result.class.table_name.singularize

...