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.