Wie bekomme ich den Namen einer Ruby-Klasse?

392

Wie kann ich den Klassennamen von einem ActiveRecord-Objekt erhalten?

Ich habe:

result = User.find(1)

Ich habe es versucht:

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

Ich brauche nur den Klassennamen in einer Zeichenfolge ( Userin diesem Fall). Gibt es dafür eine Methode?

Ich weiß, dass dies ziemlich einfach ist, aber ich habe sowohl Rails 'als auch Rubys Dokumente durchsucht und konnte es nicht finden.

und ich
quelle
1
@Oliver N.: Gibt bei normalen Ruby-Objekten Object#class.inspectdasselbe an Object#class.name, während dies bei ActiveRecord-Objekten nicht der Fall ist.
Andrew Grimm

Antworten:

732

Sie möchten .name für die Klasse des Objekts aufrufen :

result.class.name
flicken
quelle
4
Wenn ich das mache, bekomme ich die Modulnamen davor, also "Module :: SubModule :: Class", gibt es eine Möglichkeit, nur "Class" zu bekommen
Abe Petrillo
25
@Abe:result.class.name.split('::').last
Daniel Rikowski
90
@ Be: noch sauberer (ActiveSupport):result.class.name.demodulize
Pseidemann
2
Für die Neulinge da draußen können Sie den Klassennamen auch als Zeichenfolge erhalten, indem Sie die Klasse wie folgt verwenden : User.name. User.to_sscheint auch zu funktionieren.
Dan Polites
Die Demodulierungsmethode stammt von hier: apidock.com/rails/ActiveSupport/Inflector/demodulize (Sie müssen die ActiveSupport-Zeichenfolgenbeugungen laden, um sie verwenden zu können, wenn Sie kein Rails-Projekt sind.)
Per Lundberg
118

Hier ist die richtige Antwort, extrahiert aus den Kommentaren von Daniel Rikowski und Pseidemann. Ich bin es leid, Kommentare durchgehen zu müssen, um die richtige Antwort zu finden ...

Wenn Sie Rails (ActiveSupport) verwenden:

result.class.name.demodulize

Wenn Sie POR (Plain-Ol-Ruby) verwenden:

result.class.name.split('::').last
Darren Hicks
quelle
34

Beides result.class.to_sund result.class.nameArbeit.

tal
quelle
34
Konzeptionell gibt #name den Namen zurück, #to_s gibt eine Zeichenfolgendarstellung zurück, die zufällig mit dem Namen identisch ist. Ich würde mich an die Verwendung von #name halten, nur aus analer Zurückhaltung.
kch
7

Wenn Sie einen Klassennamen aus einer Klassenmethode abrufen möchten class.nameoder self.class.namenicht funktionieren. Diese werden nur ausgegeben Class, da die Klasse einer Klasse ist Class. Stattdessen können Sie einfach Folgendes verwenden name:

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

Foo::Bar.say_name

Ausgabe:

I'm a Foo::Bar!
jayhendren
quelle
3

In meinem Fall, wenn ich so etwas benutze, habe result.class.nameich so etwas wie Module1::class_name. Aber wenn wir nur wollen class_name, verwenden Sie

result.class.table_name.singularize

Chivorn Kouch
quelle