루비 클래스의 이름을 어떻게 알 수 있습니까?
ActiveRecord 개체에서 클래스 이름을 가져오려면 어떻게 해야 합니까?
소유자:
result = User.find(1)
노력했습니다.
result.class
# => User(id: integer, name: string ...)
result.to_s
# => #<User:0x3d07cdc>"
클래스 이름만 문자열로 필요합니다(User이 경우).그것을 위한 방법이 있습니까?
이게 꽤 기본적인 일인 건 알지만, 레일즈와 루비의 문서를 모두 검색했는데 찾을 수가 없었어요.
개체의 클래스에서 .name을(를) 호출하려고 합니다.
result.class.name
다니엘 리코프스키와 pseidemann의 논평에서 발췌한 정답입니다.저는 정답을 찾기 위해 댓글을 훑어봐야 하는 것에 지쳤습니다.
레일(액티브 지원)을 사용하는 경우:
result.class.name.demodulize
POR(플레인-올-루비)을 사용하는 경우:
result.class.name.split('::').last
둘다요.result.class.to_s그리고.result.class.name일하다.
클래스 메소드 내부에서 클래스 이름을 얻고 싶다면,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!
루비에서 당신은object.class.name다음과 같은 방법
module Bank
class Account
end
end
irb(main):005:0> account = Bank::Account.new
=> #<Bank::Account:0x0000000106115b00>
irb(main):006:0> account.class.name
=> "Bank::Account"
irb(main):008:0> account.class.name.split("::").last
=> "Account"
레일에서는 다른 사람이 언급한 것처럼 활성 지원에서 추가한 문자열에 메소드를 사용할 수 있습니다.문자열의 상수 식에서 모듈 부분을 제거합니다.
irb(main):014:0> account.class.name.demodulize
=> "Account"
내부적으로 이 메서드는 의 클래스 메서드를 호출합니다.ActiveSupport::Inflector클래스, 인수로 전달합니다.
# File activesupport/lib/active_support/core_ext/string/inflections.rb, line 166
def demodulize
ActiveSupport::Inflector.demodulize(self)
end
그Inflector.demodulize함수는 동일한 작업을 수행합니다.
demodulize('ActiveSupport::Inflector::Inflections') # => "Inflections"
demodulize('Inflections') # => "Inflections"
demodulize('::Inflections') # => "Inflections"
demodulize('') # => ""
그러나 내부 구현은 위의 단순 버전과 다릅니다.
# File activesupport/lib/active_support/inflector/methods.rb, line 228
def demodulize(path)
path = path.to_s
if i = path.rindex("::")
path[(i + 2)..-1]
else
path
end
end
경로 인수를 문자열로 변환한 후 마지막으로 발생한 항목의 인덱스를 가져옵니다.::루비의 기능을 사용합니다.존재하는 경우 나머지 부분 문자열을 반환합니다.그렇지 않으면 원래 문자열을 반환합니다.그array[n..-1]식은 부분 문자열을 반환합니다.n문자열의 마지막 문자까지.
저는 Rails가 왜 이 대안적인 접근법을 사용하는지 찾기 위해 벤치마크 연구를 하지 않았습니다.rindex(이유를 알고 있다면 댓글을 달아주세요) 하지만 코드 가독성 애호가로서, 저는 첫 번째 사람이 사용하는 것을 좋아합니다.split그리고.last기능들.
저 같은 경우에는.result.class.name나는 그런 것을 가지고 있습니다.Module1::class_name하지만 우리가 원한다면,class_name,사용하다
result.class.table_name.singularize
언급URL : https://stackoverflow.com/questions/826210/how-do-i-get-the-name-of-a-ruby-class
'source' 카테고리의 다른 글
| Git: 푸시 후 커밋된 파일 제거 (0) | 2023.06.26 |
|---|---|
| tsql 함수 또는 저장 프로시저에서 표 반환 (0) | 2023.06.26 |
| Kubernetes Java 응용 프로그램에서 최신 포드를 가져오는 방법 (0) | 2023.06.26 |
| SQL Server 테이블에서 외부 키가 있는 데이터 삭제 (0) | 2023.06.26 |
| SSH 키를 제거하려면 어떻게 해야 합니까? (0) | 2023.06.26 |