ruby文字列内のクラス名を実際のクラスに変換します


87

そのクラス名を含む文字列からクラスを呼び出すにはどうすればよいですか?(私はケース/いつできると思いますが、それは醜いようです。)

私が尋ねる理由はacts_as_commentable、とりわけプラグインを使用していて、これらがcommentable_typeを列として格納しているためです。コメント可能な特定のクラスを呼び出してfind(commentable_id)、それを実行できるようにしたいと思います。

ありがとう。

回答:


131

私はあなたが欲しいものは constantize

これはRoR構造です。ルビーコア用のものがあるかわかりません


完璧です、それは私が探していたものです。
未分類2010

40
プレーンなRubyの場合は、を使用しますModule.const_get。利点はconstantize、深くネストされた名前空間でも'Functional::Collections::LazyList'.constantize機能するため、FunctionalモジュールのCollectionsモジュールからLazyListクラスを取得できるのに対しconst_get、の場合は、のようなことを行う必要があることです'Functional::Collections::LazyList'.split('::').reduce(Module, :const_get)
チャック

45
"Object".constantize # => Object

これ.constantizeはRailsメソッドであることに注意してください。プレーンなRubyでは見つかりません
Edgar Ortega

34

文字列が与えられたら、最初にclassifyを呼び出してクラス名(まだ文字列)を作成し、次にconstantizeを呼び出してクラス名定数を見つけて返そうとします(クラス名は定数であることに注意してください)。

some_string.classify.constantize

10
classifyはテーブル名用であり、複数化をうまく処理できないため、classifyの代わりにcamelizeを使用する必要があります。
ピーターブラウン

1
ありがとう!それは素晴らしいことです!
duykhoa 2013年

2
あなたの答えは本当に価値がありますが、スペースで含むテーブル名には「titleize」を使用し、文字列から空白を削除して完全なクラス名を意味するようにする必要があります。
SSR

22

これは古い質問ですが、このメモを残したいだけです。他の人にも役立つかもしれません。

プレーンな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")

7

ActiveSupportが利用可能な場合(Railsなど):String#constantizeまたはString#safe_constantize、つまり"ClassName".constantize

純粋なRubyの場合:Module#const_get、通常はObject.const_get("ClassName")

最近のルビーでは、どちらものようにモジュールにネストされた定数で動作しますObject.const_get("Outer::Inner")


6

文字列を実際のクラス名に変換して、モデルまたはその他のクラスにアクセスする場合

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`
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.