রুবি স্ট্রিংয়ে ক্লাসের নামটিকে আসল ক্লাসে রূপান্তর করে


87

এর অভ্যন্তরে সেই শ্রেণীর নাম যুক্ত একটি স্ট্রিং থেকে আমি কোনও ক্লাসকে কীভাবে কল করব? (আমি অনুমান করি আমি কেস / যখন করতে পারি তবে এটি কুৎসিত মনে হয়))

আমার জিজ্ঞাসার কারণ হ'ল আমি acts_as_commentableঅন্যদের মধ্যেও প্লাগইনটি ব্যবহার করছি এবং এগুলি কলাম হিসাবে মন্তব্যযোগ্য টাইপ সংরক্ষণ করে। find(commentable_id)এটিতে বিশেষ মন্তব্যযোগ্য শ্রেণীর যে কোনওটিকেই কল করতে আমি সক্ষম হতে চাই ।

ধন্যবাদ

উত্তর:


131

আমার মনে হয় আপনি যা চান তা constantize

এটি একটি আরআর কনস্ট্রাক্ট। আমি জানি না রুবি কোরের জন্য একটি আছে কিনা


নিখুঁত, আমি যা খুঁজছিলাম ঠিক সেটাই।
অগঠিত

40
প্লেইন রুবির জন্য, আপনি ব্যবহার করবেন Module.const_get। এর সুবিধাটি constantizeহ'ল এটি গভীরভাবে নেস্টেড নেমস্পেসগুলির সাথেও কাজ করে, যাতে আপনি 'Functional::Collections::LazyList'.constantizeমডিউল ফাংশনাল মধ্যে মডিউল সংগ্রহগুলি থেকে ক্লাস LazyList পেতে পারেন এবং এর সাথে const_getআপনাকে কিছু করতে হবে 'Functional::Collections::LazyList'.split('::').reduce(Module, :const_get)
চাক


35

একটি স্ট্রিং দেওয়া হয়েছে, শ্রেণীর নাম তৈরি করার জন্য প্রথমে শ্রেণিবদ্ধ কল করুন (এখনও একটি স্ট্রিং), তারপরে ক্লাসের নামটি ধ্রুবক সন্ধান করার এবং ফিরে পাওয়ার চেষ্টা করার জন্য কনস্টানটিজকে কল করুন ( ক্লাসের নামগুলি ধ্রুবক রয়েছে তা নোট করুন )।

some_string.classify.constantize

10
শ্রেণিবদ্ধকরণের পরিবর্তে আপনার উটচিহ্ন ব্যবহার করা উচিত কারণ শ্রেণিবদ্ধকরণটি সারণির নামের জন্য এবং বহুবচনকে খুব ভালভাবে পরিচালনা করে না।
পিটার ব্রাউন

4
আপনার উত্তরটি সত্যই মূল্যবান, তবে আপনার টেবিলের নামের জন্য "টাইটেলাইজ" ব্যবহার করা উচিত যা স্থানের সাথে অন্তর্ভুক্ত রয়েছে এবং পূর্ণ শ্রেণীর নাম অর্থ্য করতে স্ট্রিং থেকে সাদা স্থান সরিয়ে ফেলতে হবে।
এসএসআর

22

আমি জানি এটি একটি পুরানো প্রশ্ন তবে আমি এই নোটটি কেবল রেখে যেতে চাই, এটি অন্যের পক্ষে সহায়ক হতে পারে।

সরল রুবিতে, Module.const_getনেস্টেড কনস্ট্যান্টগুলি খুঁজে পেতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত কাঠামো থাকা:

module MyModule
  module MySubmodule
    class MyModel
    end
  end
end

আপনি নিম্নলিখিত হিসাবে এটি ব্যবহার করতে পারেন:

Module.const_get("MyModule::MySubmodule::MyModel")
MyModule.const_get("MySubmodule")
MyModule::MySubmodule.const_get("MyModel")

7

যখন অ্যাক্টিভসপোর্ট উপলব্ধ থাকে (উদাহরণস্বরূপ রেলগুলিতে): String#constantizeবা String#safe_constantizeএটি "ClassName".constantize

বিশুদ্ধ রুবি ইন: Module#const_getসাধারণত Object.const_get("ClassName")

সাম্প্রতিক অমূল্য সালে ধ্রুবক সঙ্গে উভয় কাজ মডিউল নেস্টেড, মত Object.const_get("Outer::Inner")


6

আপনি যদি স্ট্রিংটিকে অ্যাকুয়াল সমস্ত শ্রেণীর নামতে অ্যাক্সেস মডেল বা অন্য কোনও শ্রেণিতে রূপান্তর করতে চান

str = "group class"

> str.camelize.constantize 'or'
> str.classify.constantize 'or'
> str.titleize.constantize

Example :
  def call_me(str)
    str.titleize.gsub(" ","").constantize.all
  end

Call method : call_me("group class")

Result:
  GroupClass Load (0.7ms) SELECT `group_classes`.* FROM `group_classes`
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.