Rubyクラスの名前を取得するにはどうすればよいですか?


392

ActiveRecordオブジェクトからクラス名を取得するにはどうすればよいですか?

私が持っています:

result = User.find(1)

私は試した:

result.class
# => User(id: integer, name: string ...)
result.to_s
# => #<User:0x3d07cdc>"

文字列で(Userこの場合は)クラス名だけが必要です。その方法はありますか?

これはかなり基本的なことはわかっていますが、RailsとRubyの両方のドキュメントを検索しましたが、見つかりませんでした。


1
@Oliver N .:通常のRubyオブジェクトの場合Object#class.inspectはと同じですがObject#class.name、ActiveRecordオブジェクトの場合は異なります。
Andrew Grimm

回答:


732

オブジェクトのクラスで.nameを呼び出します:

result.class.name

4
私はこれを行うと、私はその前にモジュール名を取得するので、「モジュール::サブモジュール::クラス」、単に「クラス」取得の方法がある
阿部Petrillo

25
@阿部:result.class.name.split('::').last
Daniel Rikowski、2011年

90
@阿部:さらにすっきり(ActiveSupport):result.class.name.demodulize
pseidemann

2
初心者には、次のようなクラスを使用して、クラス名を文字列として取得することもできますUser.nameUser.to_sまた動作するようです。
Dan Polites、2012年

demodulizeメソッドはここから取得します:apidock.com/rails/ActiveSupport/Inflector/demodulize (Railsプロジェクトでない場合に使用できるようにするには、ActiveSupport文字列屈折をロードする必要があります。)
Per Lundberg

118

これが正解です。ダニエルリコウスキーとプセイデマンのコメントから抜粋したものです。私は正しい答えを見つけるためにコメントを取り除かなければならないことにうんざりしています...

Rails(ActiveSupport)を使用する場合:

result.class.name.demodulize

POR(plain-ol-Ruby)を使用する場合:

result.class.name.split('::').last

34

両方result.class.to_sresult.class.name仕事。


34
ただし、概念的には、#nameは名前を返し、#to_sは文字列表現を返します。これはたまたま名前と同じです。私は#nameの使用に固執します。
2009

7

クラスメソッド内からクラス名を取得する場合、class.nameまたは機能しself.class.nameない場合。Classクラスのクラスはなので、これらは単に出力されますClass。代わりに、次のように使用できますname

module Foo
  class Bar
    def self.say_name
      puts "I'm a #{name}!"
    end
  end
end

Foo::Bar.say_name

出力:

I'm a Foo::Bar!

3

私の場合のように、私は何かを使用するときにresult.class.name、私のようなものを得ましたModule1::class_name。しかし、必要なだけの場合はclass_name

result.class.table_name.singularize

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