Як отримати ім’я класу Ruby?


392

Як я можу отримати ім'я класу від об'єкта ActiveRecord?

Я маю:

result = User.find(1)

Я намагався:

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

Мені потрібно лише ім'я класу в рядку ( Userв даному випадку). Чи існує метод для цього?

Я знаю, що це досить просто, але я шукав документи Раїлса і Рубі, і не зміг його знайти.


1
@Oliver N .: Для звичайних об’єктів Ruby Object#class.inspectдає те саме, що і в Object#class.nameтой час, коли це не так з об'єктами ActiveRecord.
Ендрю Грімм

Відповіді:


732

Ви хочете викликати .name у класі об’єкта:

result.class.name

4
Коли я це роблю, я отримую назви модулів перед ним, тому "Модуль :: SubModule :: Class", чи є спосіб отримати просто "Class"
Abe Petrillo

25
@Abe:result.class.name.split('::').last
Даніель Ріковський

90
@Abe: ще чистіший (ActiveSupport):result.class.name.demodulize
pseidemann

2
Для новачків там, ви можете також отримати ім'я класу у вигляді рядка, використовуючи клас на зразок цього: User.name. User.to_sтакож, здається, працює.
Dan Polites

Метод демодуляції походить звідси: apidock.com/rails/ActiveSupport/Inflector/demodulize (Вам потрібно завантажити переклади рядків ActiveSupport, щоб їх можна було використовувати, якщо ви не проект Rails.)
Пер Лундберг,

118

Ось правильна відповідь, витягнута з коментарів Даніеля Ріковського та псеїдемана. Я втомився від того, щоб бур’яни через коментарі, щоб знайти правильну відповідь ...

Якщо ви використовуєте Rails (ActiveSupport):

result.class.name.demodulize

Якщо ви використовуєте POR (звичайний-ol-Ruby):

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

34

І те, result.class.to_sі result.class.nameробота.


34
Але концептуально #name повертає ім'я, #to_s повертає рядкове подання, яке просто ідентично імені. Я б дотримувався використання #name, тільки з анальної затримки.
кч

7

Якщо ви хочете отримати ім'я класу з методу всередині класу, 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!

3

У моєму випадку, коли я використовую щось подібне, result.class.nameя отримав щось подібне Module1::class_name. Але якщо ми лише хочемо class_name, використовуй

result.class.table_name.singularize

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.