আমি কীভাবে একটি রুবি শ্রেণির নাম পেতে পারি?


391

আমি কীভাবে একটি অ্যাক্টিভেকর্ড অবজেক্ট থেকে ক্লাসের নাম পেতে পারি?

আমার আছে:

result = User.find(1)

আমি চেষ্টা করেছিলাম:

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

আমার কেবলমাত্র ক্লাসের নাম দরকার, স্ট্রিংয়ের ( Userএই ক্ষেত্রে)। তার জন্য কি কোনও পদ্ধতি আছে?

আমি জানি এটি বেশ বেসিক, তবে আমি 'রেলস' এবং রুবির দুটি ডক্সই অনুসন্ধান করেছিলাম এবং এটি খুঁজে পেলাম না।


1
@ অলিভার এন .: সাধারণ রুবি অবজেক্টের সাথে Object#class.inspectএকই রকম দেয় , তবে এটি Object#class.nameঅ্যাক্টিভেকর্ড অবজেক্টের ক্ষেত্রে নয়।
অ্যান্ড্রু গ্রিম

উত্তর:


732

আপনি অবজেক্টের ক্লাসে .name কল করতে চান :

result.class.name

4
যখন আমি এটি করি আমি মডিউলটির নামগুলি এর আগে পেয়েছি, সুতরাং "মডিউল :: সাবমডিউল :: শ্রেণি", কেবল "শ্রেণি" পাওয়ার উপায় আছে
আবে পেট্রিলো

25
@ আবে:result.class.name.split('::').last
ড্যানিয়েল রিকোভস্কি

90
@ আবে: এমনকি ক্লিনার (অ্যাক্টিভসপোর্ট):result.class.name.demodulize
pseidemann

2
সেখানে আউট নতুনদের জন্য, সেই জন্যই এই মত বর্গ ব্যবহার করে একটি স্ট্রিং হিসেবে বর্গ নাম প্রাপ্ত করুন: User.nameUser.to_sকাজ মনে হয়।
ড্যান পলিটস

ডেমোডুলাইজ পদ্ধতিটি এখান থেকে এসেছে: apidock.com/rails/ActtiveSupport/Inflector/demodulize (আপনি যদি রেল প্রকল্প না হন তবে যদি আপনাকে অ্যাক্টিভসপোর্ট স্ট্রিং ইনফ্লেকশনগুলি লোড করতে হয়।)
প্রতি লন্ডবার্গ

118

ড্যানিয়েল রিকোভস্কি এবং সিডেমন দ্বারা মন্তব্যগুলি থেকে প্রাপ্ত সঠিক উত্তরটি এখানে। আমি সঠিক উত্তর খুঁজতে মন্তব্যের মাধ্যমে আগাছা ফেলে ক্লান্ত হয়ে পড়েছি ...

আপনি যদি রেলগুলি ব্যবহার করেন (অ্যাক্টিভসপোর্ট):

result.class.name.demodulize

আপনি যদি পোর (প্লেন-ওল-রুবি) ব্যবহার করেন:

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

34

উভয় result.class.to_sএবং result.class.nameকাজ।


34
তবে ধারণাগতভাবে, # নামটি নামটি ফেরত দেয়, # টি_এস একটি স্ট্রিং প্রতিনিধিত্ব করে, যা কেবল নামের সাথে অভিন্ন হয়ে দেখা দেয়। আমি কেবলমাত্র নাম ব্যবহার করা থেকে বিরত থাকব, কেবলমাত্র মলদ্বারে পুনরায় ধারণার বাইরে।
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.