রেলগুলির একটি এনাম থেকে পূর্ণসংখ্যা মান কীভাবে পাবেন?


105

আমার মডেলটিতে এমন একটি এনাম রয়েছে যা ডাটাবেসের কলামের সাথে মিল রাখে।

enumদেখে মনে হচ্ছে:

  enum sale_info: { plan_1: 1, plan_2: 2, plan_3: 3, plan_4: 4, plan_5: 5 }

আমি পূর্ণসংখ্যার মানটি কীভাবে পেতে পারি?

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

Model.sale_info.to_i

তবে এটি কেবল 0 প্রদান করে।


এটা করা উচিত Model.sale_info.value.to_i? উদাহরণস্বরূপModel.sale_info.plan_1.to_i
ফ্লোরিয়ান গ্লোব

নাফ ... কারণ আমি জানি না যে এটির ডেটাবেসে কোন স্টোরটি পরিকল্পনা করে। সুতরাং আমি এটি পুনরুদ্ধার করতে এবং এটি হিসাবে একটি কাস্ট করতে চাইinteger
ক্লিটন

উত্তর:


140

আপনি যে শ্রেণীর এনাম চালু রয়েছে তা থেকে একটি এনামের জন্য পূর্ণসংখ্যার মানগুলি পেতে পারেন:

Model.sale_infos # Pluralized version of the enum attribute name

এটি একটি হ্যাশ ফেরত দেয়:

{ "plan_1" => 1, "plan_2" => 2 ... }

তারপরে আপনি Modelশ্রেণীর উদাহরণ থেকে বিক্রয়_ইনফো মানটি ব্যবহার করতে পারেন সেই উদাহরণটির জন্য পূর্ণসংখ্য মানটি অ্যাক্সেস করতে :

my_model = Model.find(123)
Model.sale_infos[my_model.sale_info] # Returns the integer value

139

আপনি পূর্ণসংখ্যার মতো পেতে পারেন:

my_model = Model.find(123)
my_model[:sale_info] # Returns the integer value

রেল 5 এর জন্য আপডেট

রেল 5 এর জন্য উপরের পদ্ধতিটি এখন স্ট্রিংয়ের মান প্রদান করে :(

আমি আপাতত সেরা পদ্ধতিটি দেখতে পাচ্ছি:

my_model.sale_info_before_type_cast

শ্যাডওয়েলের উত্তরটিও রেল 5 এর জন্য কাজ করে চলেছে।


1
কারণ 'এনাম' আপনার মডেলটির জন্য একটি বিক্রয় বিক্রয়_ইনফো তৈরি করবে, বিক্রয়_info পদ্ধতি থেকে ফেরতের পরিবর্তে সম্পত্তি মান পেতে [: বিক্রয়_info] ব্যবহার করুন।
এটल्डস

6
নোট করুন যে মডেলটি সংরক্ষণ না করা থাকলে এই পদ্ধতিটি কাজ করে না। বিক্রয়_info_before_type_cast মান (এবং মাই_মডেল [: বিক্রয়_info]) এখনও একটি স্ট্রিং যদি এটি my_model.sale_info পরবর্তী সংরক্ষণ ছাড়াই একটি স্ট্রিং বরাদ্দ করা হয়।
টিম স্মিথ

42

রেল <5

অন্য উপায় ব্যবহার করা হবে read_attribute():

model = Model.find(123)
model.read_attribute('sale_info')

রেল> = 5

তুমি ব্যবহার করতে পার read_attribute_before_type_cast

model.read_attribute_before_type_cast(:sale_info)
=> 1

1
@ গ্রান্ট বার্চমিয়ার উত্তর আপডেট করেছেন। আপনি ব্যবহার করতে পারেন read_attribute_before_type_cast
আরশএম

5 রেলগুলির আগে, মডেল.ইড_ট্রিবিউট ('বিক্রয়_info') মডেলের সমান [: বিক্রয়_info]
zw963

1

আমার সংক্ষিপ্ত উত্তরটি Model.sale_infos[:plan_2]যদি আপনি মান পেতে চান তবে তা হয়plan_2


1

আমার রেলস 5.1 অ্যাপে একই অর্জনের জন্য আমি আমার মডেলটিতে একটি পদ্ধতি লিখেছিলাম।

আপনার কেস কেটারিং, এটি আপনার মডেলটিতে জুড়ুন এবং যখন প্রয়োজন হবে তখন এটিকে কল করুন

def numeric_sale_info
  self.class.sale_infos[sale_info]
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.