Domanda

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

Ho:

result = User.find(1)

Ho provato:

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

Ho bisogno solo del nome della classe, in una stringa ( User in questo caso). C'è un metodo per quello?

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

È stato utile?

Soluzione

Desideri chiamare .name sulla classe dell'oggetto :

result.class.name

Altri suggerimenti

Ecco la risposta corretta, estratta dai commenti di Daniel Rikowski e pseidemann. Sono stanco di dover esaminare 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

Entrambi result.class.to_s e result.class.name funzionano.

Se vuoi ottenere un nome di classe dall'interno di un metodo di classe, class.name o self.class.name non funzionerà. Questi genereranno solo 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

uscita:

I'm a Foo::Bar!

Nel mio caso quando uso qualcosa come result.class.name ho qualcosa come Module1 :: class_name . Ma se vogliamo solo class_name , usa

result.class.table_name.singularize

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top