2009-05-05 12 views
317

Comment puis-je obtenir le nom de classe à partir d'un objet ActiveRecord?Comment obtenir le nom d'une classe Ruby?

J'ai:

result = User.find(1) 

J'ai essayé:

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

J'ai besoin que le nom de classe, dans une chaîne (User dans ce cas). Y a-t-il une méthode pour cela?

Je sais que c'est assez basique, mais j'ai cherché les documents de Rails et de Ruby, et je ne l'ai pas trouvé.

+1

@Oliver N .: Avec des objets normaux Ruby, objet '# class.inspect' donne la même chose que' Object # class.name', alors que ce n'est pas le cas avec des objets ActiveRecord. –

Répondre

604

Vous voulez appeler .name sur la classe de l'objet:

result.class.name 
+3

Lorsque je fais cela, je reçois les noms de modules avant, donc "Module :: SubModule :: Class", est-il un moyen d'obtenir juste "Class" –

+22

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

+72

@Abe: encore plus propre (ActiveSupport): 'result.class.name.demodulize' – pseidemann

31

deux travaillent result.class.to_s et result.class.name.

+28

Mais conceptuellement, #name renvoie le nom, #to_s renvoie une représentation sous forme de chaîne, Il arrive juste d'être identique au nom. Je m'en tiens à l'utilisation de #name, juste en dehors de la rétention anale. – kch

87

Voici la bonne réponse, extraite des commentaires de Daniel Rikowski et de pseidemann. Je suis fatigué d'avoir à désherber à travers des commentaires pour trouver la bonne réponse ...

Si vous utilisez Rails (ActiveSupport):

result.class.name.demodulize 

Si vous utilisez POR (-ol-Ruby ordinaire):

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

Dans mon cas quand j'utilise quelque chose comme result.class.name j'ai quelque chose comme Module1::class_name. Mais si nous voulons que class_name, utilisez

result.table_name.singularize

Questions connexes