Ruby sınıfının adını nasıl alabilirim?


392

ActiveRecord nesnesinden sınıf adını nasıl alabilirim?

Sahibim:

result = User.find(1)

Denedim:

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

Bir dize ( Userbu durumda) , sadece sınıf adı gerekir . Bunun için bir yöntem var mı?

Bunun oldukça basit olduğunu biliyorum, ama hem Rails 'hem de Ruby'nin belgelerini araştırdım ve bulamadım.


1
@Oliver N .: Normal Ruby nesnelerinde Object#class.inspectolduğu gibi Object#class.name, ActiveRecord nesneleri için geçerli değildir.
— Andrew Grimm

Yanıtlar:


732

Nesnenin sınıfında .name öğesini çağırmak istiyorsunuz :

result.class.name

4
Bunu yaptığımda daha önce Modül adlarını alıyorum, bu yüzden "Module :: SubModule :: Class", sadece "Class" almanın bir yolu var
— Abe Petrillo

25
@Abe:result.class.name.split('::').last
— Daniel Rikowski

90
@Abe: hatta temizleyici (ActiveSupport):result.class.name.demodulize
— pseidemann

2
Orada yeni gelenler için, ayrıca böyle sınıfını kullanarak bir dize olarak sınıf adını edinebilirsiniz: User.name. User.to_sAyrıca işe yarıyor gibi görünüyor.
— Dan Polites

Demodulize yöntemi buradan gelir: apidock.com/rails/ActiveSupport/Inflector/demodulize (Bir Rails projesi değilseniz, kullanabilmek için ActiveSupport dize bükülmelerini yüklemeniz gerekir.)
— Per Lundberg

118

İşte Daniel Rikowski ve pseidemann'ın yorumlarından çıkarılan doğru cevap. Doğru cevabı bulmak için yorumlarda ot kullanmaktan yoruldum ...

Rails (ActiveSupport) kullanıyorsanız:

result.class.name.demodulize

POR (plain-ol-Ruby) kullanıyorsanız:

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

34

Hem result.class.to_sve result.class.nameçalışması.


34
Ancak kavramsal olarak, #name adı döndürür, #to_s, adla aynı olan bir dize temsili döndürür. #Name kullanmaya devam ederdim, sadece anal-kalıcılık dışında.
— kch

7

Bir sınıf yönteminin içinden bir sınıf adı almak istiyorsanız class.nameveya self.class.nameçalışmazsa. ClassBir sınıfın sınıfı olduğu için bunlar sadece çıktı alacaktır Class. Bunun yerine şunları kullanabilirsiniz name:

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

Foo::Bar.say_name

çıktı:

I'm a Foo::Bar!

3

Gibi Benim durumumda bir şey kullandığınızda result.class.nameben gibi bir şey var Module1::class_name. Ama sadece istersek class_name,

result.class.table_name.singularize

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.