我如何获得Ruby类的名称?

and*_*ndi 375 ruby ruby-on-rails rails-activerecord

如何从ActiveRecord对象获取类名?

我有:

result = User.find(1)
Run Code Online (Sandbox Code Playgroud)

我试过了:

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

我只需要一个字符串中的类名(User在本例中).有没有办法呢?

我知道这是非常基本的,但我搜索了Rails和Ruby的文档,我找不到它.

fli*_*ken 706

你想在对象的类上调用.name:

result.class.name
Run Code Online (Sandbox Code Playgroud)

  • @Abe:甚至更干净(ActiveSupport):`result.class.name.demodulize` (89认同)
  • @Abe:`result.class.name.split('::').last` (24认同)
  • 当我这样做时,我得到它之前的模块名称,所以"Module :: SubModule :: Class",有没有办法获得"Class" (4认同)
  • 对于在那里的新手,您还可以通过使用类似User.name的类以字符串的形式获取类名。`User.to_s`似乎也起作用。 (2认同)

Dar*_*cks 114

这是正确答案,摘自Daniel Rikowski和pseidemann的评论.我厌倦了通过评论来寻找合适的答案......

如果您使用Rails(ActiveSupport):

result.class.name.demodulize
Run Code Online (Sandbox Code Playgroud)

如果你使用POR(普通红宝石):

result.class.name.split('::').last
Run Code Online (Sandbox Code Playgroud)

  • 将解决方案与其他解决方案进行比较并声称更好的答案也应该解释原因。 (3认同)

小智 34

无论result.class.to_sresult.class.name工作.

  • 但从概念上讲,#name返回名称,#to_s返回一个字符串表示,恰好与名称相同.我坚持使用#name,只是出于肛门保持. (32认同)

jay*_*ren 6

如果你想从一个类的方法中获得一个类名,class.nameself.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
Run Code Online (Sandbox Code Playgroud)

输出:

I'm a Foo::Bar!
Run Code Online (Sandbox Code Playgroud)