루비 문자열의 클래스 이름을 실제 클래스로 변환
클래스 이름이 포함 된 문자열에서 클래스를 호출하려면 어떻게해야합니까? (나는 사건 / 언제를 할 수 있다고 생각하지만 그것은 추악한 것 같습니다.)
내가 묻는 이유는 acts_as_commentable
다른 것들 중에서 플러그인을 사용하고 있기 때문에 commentable_type을 열로 저장하기 때문입니다. 나는 find(commentable_id)
그것에 대해 할 수있는 특정 주석 클래스를 호출 할 수 있기를 원합니다 .
감사.
나는 당신이 원하는 것은 constantize
그것은 RoR 구조입니다. 루비 코어가 있는지 모르겠어요
"Object".constantize # => Object
문자열이 주어지면 먼저 classify 를 호출 하여 클래스 이름 (여전히 문자열)을 만든 다음 constantize 를 호출 하여 클래스 이름 상수를 찾아 반환합니다 ( 클래스 이름은 상수입니다 ).
some_string.classify.constantize
나는 이것이 오래된 질문이라는 것을 알고 있지만이 메모를 남기고 싶습니다. 다른 사람들에게 도움이 될 수 있습니다.
일반 Ruby에서는 Module.const_get
중첩 된 상수를 찾을 수 있습니다. 예를 들어 다음과 같은 구조가 있습니다.
module MyModule
module MySubmodule
class MyModel
end
end
end
다음과 같이 사용할 수 있습니다.
Module.const_get("MyModule::MySubmodule::MyModel")
MyModule.const_get("MySubmodule")
MyModule::MySubmodule.const_get("MyModel")
모델 또는 다른 클래스에 액세스하기 위해 문자열을 실제 클래스 이름으로 변환하려는 경우
str = "group class"
> str.camelize.constantize 'or'
> str.classify.constantize 'or'
> str.titleize.constantize
Example :
def call_me(str)
str.titleize.gsub(" ","").constantize.all
end
Call method : call_me("group class")
Result:
GroupClass Load (0.7ms) SELECT `group_classes`.* FROM `group_classes`
ActiveSupport를 사용할 수있는 경우 (예 : Rails) : String#constantize
또는 String#safe_constantize
, 즉 "ClassName".constantize
.
순수 Ruby : Module#const_get
, 일반적으로 Object.const_get("ClassName")
.
최근 루비에서는 둘 다 .NET과 같이 모듈에 중첩 된 상수로 작동 Object.const_get("Outer::Inner")
합니다.
참고 URL : https://stackoverflow.com/questions/3464007/ruby-convert-class-name-in-string-to-actual-class
'programing' 카테고리의 다른 글
SQL Server로 마지막 행을 읽는 방법 (0) | 2020.09.23 |
---|---|
모의 위치 비활성화 / 확인 (gps 스푸핑 방지) (0) | 2020.09.23 |
파일 이름을 변경하면 파일의 MD5 해시에 영향을 줍니까? (0) | 2020.09.23 |
관리되는 .NET 언어로 JIT 컴파일러 (네이티브 코드로)를 작성할 수 있습니까? (0) | 2020.09.23 |
자바 스크립트는 문자열에서 동적으로 객체 메소드를 호출합니다. (0) | 2020.09.23 |