मुझे रूबी वर्ग का नाम कैसे मिलेगा?


392

मैं ActiveRecord ऑब्जेक्ट से वर्ग का नाम कैसे प्राप्त कर सकता हूं?

मेरे पास है:

result = User.find(1)

मैंने कोशिश की:

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

मुझे केवल कक्षा नाम की आवश्यकता है, एक स्ट्रिंग में ( Userइस मामले में)। क्या उसके लिए कोई विधि है?

मुझे पता है कि यह बहुत बुनियादी है, लेकिन मैंने दोनों रेल और रूबी के डॉक्स खोजे, और मुझे नहीं मिला।


1
@ ऑलिवर एन .: सामान्य रूबी वस्तुओं के साथ, Object#class.inspectवही देता है Object#class.name, जबकि ActiveRecord ऑब्जेक्ट के साथ ऐसा नहीं है।
एंड्रयू ग्रिम

जवाबों:


732

आप कॉल करना चाहते .name ऑब्जेक्ट के वर्ग पर :

result.class.name

4
जब मैं ऐसा करता हूं तो मुझे इसके पहले मॉड्यूल के नाम मिलते हैं, इसलिए "मॉड्यूल :: सबमॉड्यूल :: क्लास", क्या सिर्फ "क्लास" प्राप्त करने का एक तरीका है
अबे पेट्रिलो

25
@ अब्बे:result.class.name.split('::').last
डैनियल रिकोस्की

90
@Abe: यहां तक ​​कि क्लीनर (ActiveSupport):result.class.name.demodulize
pseidemann

2
नए लोगों के लिए, आप इस तरह से कक्षा का उपयोग करके एक स्ट्रिंग के रूप में वर्ग का नाम भी प्राप्त कर सकते हैं User.name:। User.to_sभी काम करने लगता है।
दान पोलीस

डिमॉडुलाइज विधि यहां से आती है: apidock.com/rails/ActiveSupport/Inflector/demodulize (यदि आप एक रेल परियोजना नहीं है, तो उपयोग करने में सक्षम होने के लिए आपको ActiveSupport स्ट्रिंग inflections लोड करने की आवश्यकता है।)
प्रति Lundberg

118

यहाँ सही जवाब है, डैनियल रिकोव्स्की और pseidemann द्वारा टिप्पणियों से निकाला गया। मैं सही उत्तर खोजने के लिए टिप्पणियों के माध्यम से खरपतवार होने से थक गया हूं ...

यदि आप रेल (ActiveSupport) का उपयोग करते हैं:

result.class.name.demodulize

यदि आप POR (सादे-ओएल-रूबी) का उपयोग करते हैं:

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

34

दोनों result.class.to_sऔर result.class.nameकाम।


34
लेकिन अवधारणात्मक रूप से, #name नाम लौटाता है, #to_s एक स्ट्रिंग प्रतिनिधित्व लौटाता है, जो सिर्फ नाम के समान होता है। मैं #name का उपयोग करने के लिए चिपका रहूंगा, बस गुदा-प्रतिशोध से।
शाम 5'09

7

यदि आप एक वर्ग विधि के अंदर से एक वर्ग का नाम प्राप्त करना चाहते हैं, class.nameया self.class.nameकाम नहीं करेगा। ये सिर्फ आउटपुट होंगे Class, क्योंकि एक क्लास की क्लास होती है Class। इसके बजाय, आप बस उपयोग कर सकते हैं name:

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

Foo::Bar.say_name

उत्पादन:

I'm a Foo::Bar!

3

मेरे मामले में जब मैं कुछ का उपयोग करता हूं तो मुझे कुछ result.class.nameऐसा मिलता है Module1::class_name। लेकिन अगर हम केवल चाहते हैं class_name, का उपयोग करें

result.class.table_name.singularize

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.