如何获得Ruby类的名称?


391

如何从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对象则不是这种情况。
安德鲁·格林

Answers:


732

您想在对象的类上调用.name

result.class.name

4
当我这样做时,我会在其之前获取模块名称,因此“ Module :: SubModule :: Class”是否有一种获取“ Class”的方法
Abe Petrillo

25
@安倍:result.class.name.split('::').last
Daniel Rikowski 2011年

90
@安倍晋三:甚至更清洁(ActiveSupport):result.class.name.demodulize
pseidemann 2011年

2
对于在那里的新手,您还可以通过使用如下类来获得类名称作为字符串User.nameUser.to_s似乎也可以。
Dan Polites

解调方法来自此处:apidock.com/rails/ActiveSupport/Inflector/demodulize (如果您不是Rails项目,则需要加载ActiveSupport字符串变形才能使用。)
Per Lundberg,2016年

118

这是正确的答案,摘自Daniel Rikowski和pseidemann的评论。我厌倦了必须通过注释进行除草来找到正确的答案...

如果您使用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。
kch

7

如果你想从一个类的方法中获得一个类名,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

输出:

I'm a Foo::Bar!

3

就我而言,当我使用类似的东西时,result.class.name我会得到类似的东西Module1::class_name。但是如果我们只想class_name使用

result.class.table_name.singularize

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.