Ruby 클래스의 이름은 어떻게 얻습니까?


392

ActiveRecord 객체에서 클래스 이름을 어떻게 얻을 수 있습니까?

나는 가지고있다:

result = User.find(1)

나는 시도했다 :

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

문자열 ( User이 경우) 에는 클래스 이름 만 필요합니다 . 그 방법이 있습니까?

나는 이것이 매우 기본적이라는 것을 알고 있지만 Rails와 Ruby의 문서를 모두 검색했지만 찾을 수 없었습니다.


1
@Oliver N .: 일반 Ruby 객체 의 경우와 Object#class.inspect동일 Object#class.name하지만 ActiveRecord 객체의 경우는 아닙니다.
Andrew Grimm

답변:


732

객체의 클래스에서 .name 을 호출하려고합니다 .

result.class.name

4
이 작업을 수행하기 전에 모듈 이름을 얻습니다. "Module :: SubModule :: Class", "Class"를 얻는 방법이 있습니까
Abe Petrillo

25
@Abe :result.class.name.split('::').last
Daniel Rikowski

90
@Abe : 더 깔끔한 (ActiveSupport) :result.class.name.demodulize
pseidemann

2
새로 온 사람들을 위해 다음과 같은 클래스를 사용하여 클래스 이름을 문자열로 얻을 수도 있습니다 User.name. User.to_s또한 작동하는 것 같습니다.
Dan Polites

복조 방법은 다음과 같습니다. apidock.com/rails/ActiveSupport/Inflector/demodulize(Rails 프로젝트가 아닌 경우 사용할 수 있으려면 ActiveSupport 문자열 변곡을로드해야합니다.)
Per Lundberg

118

Daniel Rikowski와 pseidemann의 의견에서 발췌 한 정답입니다. 정답을 찾기 위해 의견을 정리해야하는 데 지쳤습니다 ...

Rails (ActiveSupport)를 사용하는 경우 :

result.class.name.demodulize

POR (plain-ol-Ruby)을 사용하는 경우 :

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

34

모두 result.class.to_sresult.class.name작동합니다.


34
그러나 개념적으로 #name은 이름을 반환하고 #to_s는 이름과 동일한 문자열 표현을 반환합니다. 나는 항문 유지에서 #name을 계속 사용합니다.
kch

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.