2009-05-05 5 views
317

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

у меня есть:

result = User.find(1) 

Я пробовал:

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

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

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

+1

@Oliver N .: С обычными объектами Ruby, но 'Объект # class.inspect' дает такой же, как объект' # class.name', в то время как это не случай с объектами ActiveRecord. –

ответ

604

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

result.class.name 
+3

Когда я это делаю, я получаю имена модулей перед ним, поэтому «Module :: SubModule :: Class» есть способ получить только «Класс» –

+22

@Abe: 'result.class.name.split (':: ') .last' –

+72

@Abe: even cleaner (ActiveSupport): 'result.class.name.demodulize' – pseidemann

31

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

+28

Но концептуально #name возвращает имя, #to_s возвращает строковое представление, которое просто оказывается идентичным имени. Я придерживаюсь использования #name, только из анальной-ретентивности. – kch

87

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

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

result.class.name.demodulize 

Если вы используете ПОР (равнинно-ол-рубин): ​​

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

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

result.table_name.singularize

Смежные вопросы