How do I get the name of a Ruby class?
Ruby on-RailsRubyRails ActiverecordRuby on-Rails Problem Overview
How can I get the class name from an ActiveRecord object?
I have:
result = User.find(1)
I tried:
result.class
# => User(id: integer, name: string ...)
result.to_s
# => #<User:0x3d07cdc>"
I need only the class name, in a string (User
in this case). Is there a method for that?
I know this is pretty basic, but I searched both Rails' and Ruby's docs, and I couldn't find it.
Ruby on-Rails Solutions
Solution 1 - Ruby on-Rails
You want to call .name on the object's class:
result.class.name
Solution 2 - Ruby on-Rails
Here's the correct answer, extracted from comments by Daniel Rikowski and pseidemann. I'm tired of having to weed through comments to find the right answer...
If you use Rails (ActiveSupport):
result.class.name.demodulize
If you use POR (plain-ol-Ruby):
result.class.name.split('::').last
Solution 3 - Ruby on-Rails
Both result.class.to_s
and result.class.name
work.
Solution 4 - Ruby on-Rails
If you want to get a class name from inside a class method, class.name
or self.class.name
won't work. These will just output Class
, since the class of a class is Class
. Instead, you can just use name
:
module Foo
class Bar
def self.say_name
puts "I'm a #{name}!"
end
end
end
Foo::Bar.say_name
output:
I'm a Foo::Bar!
Solution 5 - Ruby on-Rails
In my case when I use something like result.class.name
I got something like Module1::class_name
. But if we only want class_name
, use
result.class.table_name.singularize