そのクラス名を含む文字列からクラスを呼び出すにはどうすればよいですか?(私はケース/いつできると思いますが、それは醜いようです。)
私が尋ねる理由はacts_as_commentable
、とりわけプラグインを使用していて、これらがcommentable_typeを列として格納しているためです。コメント可能な特定のクラスを呼び出してfind(commentable_id)
、それを実行できるようにしたいと思います。
ありがとう。
回答:
私はあなたが欲しいものは constantize
これはRoR構造です。ルビーコア用のものがあるかわかりません
Module.const_get
。利点はconstantize
、深くネストされた名前空間でも'Functional::Collections::LazyList'.constantize
機能するため、FunctionalモジュールのCollectionsモジュールからLazyListクラスを取得できるのに対しconst_get
、の場合は、のようなことを行う必要があることです'Functional::Collections::LazyList'.split('::').reduce(Module, :const_get)
。
"Object".constantize # => Object
.constantize
はRailsメソッドであることに注意してください。プレーンなRubyでは見つかりません
文字列が与えられたら、最初に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")
。
最近のルビーでは、どちらものようにモジュールにネストされた定数で動作します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`