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.


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

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

34

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


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!

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.