클래스 이름이 포함 된 문자열에서 클래스를 호출하려면 어떻게해야합니까? (나는 사건 / 언제를 할 수 있다고 생각하지만 그것은 추악한 것 같습니다.)
내가 묻는 이유는 acts_as_commentable
다른 것들 중에서 플러그인을 사용하고 있기 때문에 commentable_type을 열로 저장하기 때문입니다. 나는 find(commentable_id)
그것에 대해 할 수있는 특정 주석 클래스를 호출 할 수 있기를 원합니다 .
감사.
답변
답변
"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")
답변
ActiveSupport를 사용할 수있는 경우 (예 : Rails) : String#constantize
또는 String#safe_constantize
, 즉 "ClassName".constantize
.
순수 Ruby : Module#const_get
, 일반적으로 Object.const_get("ClassName")
.
최근의 루비에서는 둘 다 in과 같이 모듈에 중첩 된 상수로 작동 Object.const_get("Outer::Inner")
합니다.
답변
모델 또는 다른 클래스에 액세스하기 위해 문자열을 실제 클래스 이름으로 변환하려는 경우
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`