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.


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

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

34

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


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!

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.