如何从ActiveRecord对象中获得类名?

我有:

result = User.find(1)

我试着:

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

我只需要类名,在字符串中(在本例中为User)。有什么方法吗?

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


当前回答

如果你想从类方法内部获取类名,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!

其他回答

以下是正确答案,摘自Daniel Rikowski和pseidemann的评论。我厌倦了在评论中寻找正确答案。

如果你使用Rails (ActiveSupport):

result.class.name.demodulize

如果你使用POR (plain-ol-Ruby):

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

在我的例子中,当我使用result.class.name之类的东西时,我得到了Module1::class_name之类的东西。但如果我们只需要class_name,则使用

result.class.table_name.singularize

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

result.class.name

result.class。To_s和result.class.name工作。

如果你想从类方法内部获取类名,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!