ฉันจะรับชื่อคลาส Ruby ได้อย่างไร


392

ฉันจะรับชื่อคลาสจากวัตถุ ActiveRecord ได้อย่างไร

ฉันมี:

result = User.find(1)

ฉันเหนื่อย:

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

ฉันต้องการชื่อคลาสเท่านั้นในสตริง ( Userในกรณีนี้) มีวิธีการไหม?

ฉันรู้ว่ามันค่อนข้างธรรมดา แต่ฉันค้นหาทั้งเอกสารของ Rails และ Ruby และฉันหามันไม่เจอ


1
@Oliver N .: ด้วยอ็อบเจ็กต์ Ruby ปกติObject#class.inspectให้เหมือนกับในObject#class.nameขณะที่นี่ไม่ใช่กรณีที่มีวัตถุ ActiveRecord
Andrew Grimm

คำตอบ:


732

คุณต้องการโทรหา. nameในคลาสของวัตถุ:

result.class.name

4
เมื่อฉันทำสิ่งนี้ฉันจะได้รับชื่อโมดูลก่อนหน้านี้ดังนั้น "Module :: SubModule :: Class" มีวิธีรับ "Class" เพียงอย่างเดียวหรือไม่
Abe Petrillo

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

90
@Abe: สะอาดยิ่งขึ้น (ActiveSupport):result.class.name.demodulize
pseidemann

2
User.nameสำหรับผู้มาใหม่ออกมีคุณยังสามารถได้รับชื่อชั้นเป็นสตริงโดยใช้คลาสเช่นนี้: User.to_sดูเหมือนว่าจะทำงาน
Dan Polites

วิธี demodulize มาจากที่นี่: apidock.com/rails/ActiveSupport/Inflector/demodulize (คุณต้องโหลดการผันสตริงสตริง ActiveSupport เพื่อให้สามารถใช้งานได้หากคุณไม่ใช่โครงการ Rails
Per Lundberg

118

นี่คือคำตอบที่ถูกต้องสกัดจากความคิดเห็นโดย Daniel Rikowski และ pseidemann ฉันเบื่อที่จะต้องกำจัดวัชพืชผ่านความคิดเห็นเพื่อค้นหาคำตอบที่ถูกต้อง ...

หากคุณใช้ Rails (ActiveSupport):

result.class.name.demodulize

หากคุณใช้ POR (plain-ol-Ruby):

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

34

ทั้งงานresult.class.to_sและresult.class.name


34
แต่ตามแนวคิดแล้ว #name จะส่งคืนชื่อ #to_s จะส่งกลับการแทนสตริงซึ่งเพิ่งเกิดขึ้นเหมือนกับชื่อ ฉันจะใช้ #name เพียงออกจากการตอบโต้ทางทวารหนัก
kch

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.