Come posso ottenere il nome di una lezione di Ruby?


392

Come posso ottenere il nome della classe da un oggetto ActiveRecord?

Io ho:

result = User.find(1)

Provai:

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

Mi serve solo il nome della classe, in una stringa ( Userin questo caso). C'è un metodo per quello?

So che questo è piuttosto semplice, ma ho cercato sia i documenti di Rails che quelli di Ruby, e non sono riuscito a trovarlo.


1
@Oliver N .: Con i normali oggetti Ruby, Object#class.inspectdà lo stesso di Object#class.name, mentre questo non è il caso degli oggetti ActiveRecord.
Andrew Grimm,

Risposte:


732

Vuoi chiamare .name sulla classe dell'oggetto:

result.class.name

4
Quando lo faccio ottengo i nomi dei moduli prima di esso, quindi "Modulo :: Sottomodulo :: Classe", c'è un modo per ottenere solo "Classe"
Abe Petrillo,

25
@Abe:result.class.name.split('::').last
Daniel Rikowski il

90
@Abe: ancora più pulito (ActiveSupport):result.class.name.demodulize
pseidemann,

2
Per i nuovi arrivati là fuori, è anche possibile ottenere il nome della classe come una stringa utilizzando la classe in questo modo: User.name. User.to_ssembra funzionare anche.
Dan Polites,

Il metodo demodulize viene da qui: apidock.com/rails/ActiveSupport/Inflector/demodulize (è necessario caricare le inflessioni di stringa ActiveSupport per poter utilizzare se, se non si è un progetto Rails.)
Per Lundberg

118

Ecco la risposta corretta, estratta dai commenti di Daniel Rikowski e pseidemann. Sono stanco di dover eliminare i commenti per trovare la risposta giusta ...

Se si utilizza Rails (ActiveSupport):

result.class.name.demodulize

Se usi POR (plain-ol-Ruby):

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

34

Entrambi result.class.to_se result.class.namefunzionano.


34
Ma concettualmente, #name restituisce il nome, #to_s restituisce una rappresentazione in forma di stringa, che sembra essere identica al nome. Continuerei a usare #name, solo per ritenzione anale.
kch,

7

Se si desidera ottenere un nome di classe dall'interno di un metodo di classe class.nameo self.class.namenon funziona. Questi produrranno solo output Class, poiché la classe di una classe è Class. Invece, puoi semplicemente usare name:

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

Foo::Bar.say_name

produzione:

I'm a Foo::Bar!

3

Nel mio caso quando uso qualcosa di simile result.class.nameho qualcosa di simile Module1::class_name. Ma se vogliamo solo class_name, usa

result.class.table_name.singularize

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.