2009-05-05 3 views
317

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

ho:

result = User.find(1) 

ho provato:

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

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

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 normali oggetti di Ruby, 'Object # class.inspect' dà la stessa' Object # class.name', mentre questo non è il caso con oggetti ActiveRecord. –

risposta

604

che si desidera chiamare .name sulla classe dell'oggetto:

result.class.name 
+3

Quando faccio questo ottengo i nomi dei moduli prima di esso, quindi "Module :: SubModule :: Class", c'è un modo per ottenere solo "Class" –

+22

@Abe: 'result.class.name.split (':: ') .last' –

+72

@Abe: anche più pulito (ActiveSupport): 'result.class.name.demodulize' – pseidemann

31

Sia result.class.to_s e result.class.name lavoro.

+28

Ma concettualmente, #name restituisce il nome, #to_s restituisce una rappresentazione stringa, che capita solo di essere identico al nome. Mi limiterei a usare #name, appena fuori dalla ritenzione anale. – kch

87

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

Se si utilizza Rails (ActiveSupport):

result.class.name.demodulize 

Se si utilizza POR (plain-ol-Ruby):

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

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

result.table_name.singularize