Comment puis-je obtenir le nom de la classe d'un objet ActiveRecord?
J'ai:
result = User.find(1)
J'ai essayé:
result.class
# => User(id: integer, name: string ...)
result.to_s
# => #<User:0x3d07cdc>"
Je n'ai besoin que du nom de la classe, dans une chaîne (User
dans ce cas). Y a-t-il une méthode pour cela?
Je sais que c'est assez élémentaire, mais j'ai consulté les documents de Rails et de Ruby et je ne l'ai pas trouvée.
Vous voulez appeler . Name sur la classe de l'objet:
result.class.name
Voici la réponse correcte, extraite des commentaires de Daniel Rikowski et de pseidemann. J'en ai marre de devoir lire les commentaires pour trouver la bonne réponse ...
Si vous utilisez Rails (ActiveSupport):
result.class.name.demodulize
Si vous utilisez POR (plain-ol-Ruby):
result.class.name.split('::').last
result.class.to_s
et result.class.name
fonctionnent tous les deux.
Si vous voulez obtenir un nom de classe à l'intérieur d'une méthode de classe, class.name
ou self.class.name
ne fonctionnera pas. Celles-ci vont simplement sortir Class
, puisque la classe d'une classe est Class
. Au lieu de cela, vous pouvez simplement utiliser name
:
module Foo
class Bar
def self.say_name
puts "I'm a #{name}!"
end
end
end
Foo::Bar.say_name
sortie:
I'm a Foo::Bar!
Dans mon cas, lorsque j'utilise quelque chose comme result.class.name
j'ai quelque chose comme Module1::class_name
. Mais si nous voulons seulement class_name
, utilisez
result.class.table_name.singularize
Vous pouvez utiliser la méthode class
pour obtenir la classe de tout objet en Ruby.
par exemple.
array= []
=> []
array.class
=> Array
hash = {}
=> {}
hash.class
=> Hash
string = 'This is String'
=> "This is String"
string.class
=> String