[ruby-on-rails] 루비 문자열의 클래스 이름을 실제 클래스로 변환

클래스 이름이 포함 된 문자열에서 클래스를 호출하려면 어떻게해야합니까? (나는 사건 / 언제를 할 수 있다고 생각하지만 그것은 추악한 것 같습니다.)

내가 묻는 이유는 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")


답변

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`


답변