Bagaimana cara saya mendapatkan nama kelas Ruby?

392

Bagaimana saya bisa mendapatkan nama kelas dari objek ActiveRecord?

Saya sudah:

result = User.find(1)

Saya mencoba:

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

Saya hanya perlu nama kelas, dalam sebuah string ( Userdalam hal ini). Apakah ada metode untuk itu?

Saya tahu ini cukup mendasar, tetapi saya mencari dokumen Rails dan Ruby, dan saya tidak dapat menemukannya.

dan saya
sumber
1
@Oliver N .: Dengan objek Ruby normal, Object#class.inspectmemberikan hal yang sama Object#class.name, sedangkan ini bukan kasus dengan objek ActiveRecord.
Andrew Grimm

Jawaban:

732

Anda ingin memanggil .name di kelas objek:

result.class.name
menebal
sumber
4
Ketika saya melakukan ini saya mendapatkan nama-nama Modul sebelum itu, jadi "Modul :: SubModule :: Class", apakah ada cara untuk mendapatkan hanya "Kelas"
Abe Petrillo
25
@Be:result.class.name.split('::').last
Daniel Rikowski
90
@Abe: lebih bersih (ActiveSupport):result.class.name.demodulize
pseidemann
2
Untuk pendatang baru di luar sana, Anda juga dapat memperoleh nama kelas sebagai string dengan menggunakan kelas seperti ini: User.name. User.to_sjuga sepertinya berhasil.
Dan Polites
Metode demodulasi berasal dari sini: apidock.com/rails/ActiveSupport/Inflector/demodulize (Anda perlu memuat infleksi string ActiveSupport agar dapat digunakan jika, jika Anda bukan proyek Rails.)
Per Lundberg
118

Inilah jawaban yang benar, diekstraksi dari komentar oleh Daniel Rikowski dan pseidemann. Saya lelah harus menyiangi komentar untuk menemukan jawaban yang tepat ...

Jika Anda menggunakan Rails (ActiveSupport):

result.class.name.demodulize

Jika Anda menggunakan POR (plain-ol-Ruby):

result.class.name.split('::').last
Darren Hicks
sumber
34

Keduanya result.class.to_sdan result.class.namebekerja.

tal
sumber
34
Tapi secara konseptual, #name mengembalikan nama, #to_s mengembalikan representasi string, yang kebetulan identik dengan namanya. Saya akan tetap menggunakan #name, hanya karena anal-retentiveness.
kch
7

Jika Anda ingin mendapatkan nama kelas dari dalam metode kelas, class.nameatau self.class.nametidak akan berfungsi. Ini hanya akan menampilkan Class, karena kelas suatu kelas Class. Sebagai gantinya, Anda bisa menggunakan name:

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

Foo::Bar.say_name

keluaran:

I'm a Foo::Bar!
jayhendren
sumber
3

Dalam kasus saya ketika saya menggunakan sesuatu seperti result.class.namesaya mendapat sesuatu seperti Module1::class_name. Tetapi jika kita hanya ingin class_name, gunakan

result.class.table_name.singularize

Chivorn Kouch
sumber