একটি প্রশ্ন কল্পনা করুন যা হয় "মুলতুবি", "অনুমোদিত", বা "পতাকাঙ্কিত" হতে পারে। অথবা একটি ফোন নম্বর যা একটি "বাড়ি", "অফিস", "মোবাইল", বা "ফ্যাক্স" (যদি এটি 1982 হয়)।
কিছু মডেল এই ধরনের ডেটার জন্য কল করে৷ একটি বৈশিষ্ট্য যা কয়েকটি ভিন্ন মানের মধ্যে একটি থাকতে পারে। এবং সেই মানগুলির সেট প্রায় কখনই পরিবর্তিত হয় না৷
এটি এমন একটি পরিস্থিতি যেখানে, যদি এটি সাধারণ রুবি হয় তবে আপনি কেবল একটি প্রতীক ব্যবহার করতেন।
আপনি একটি PhoneNumberType বা QuestionStatus মডেল এবং একটি belongs_to
তৈরি করতে পারেন এই মানগুলি ধরে রাখার সম্পর্ক, তবে এটি মূল্যবান বলে মনে হয় না। আপনি এগুলিকে একটি yaml ফাইলে স্টাফ করতে পারেন, কিন্তু এখন আপনার বস্তুটি কী করতে পারে তা বোঝার জন্য আপনাকে সম্পূর্ণ ভিন্ন জায়গায় দেখতে হবে৷
4.1-এ, Rails ActiveRecord enums-এর সাহায্যে এই সমস্যাটি সমাধান করার জন্য একটি ছুরিকাঘাত করেছিল।
মডেলে কয়েকটি মান
ActiveRecord enums বেশ সহজ. আপনি আপনার মডেলকে একটি integer
দেন কলাম:
bin/rails g model phone number:string phone_number_type:integer
বৈশিষ্ট্যগুলি যে মানগুলি গ্রহণ করতে পারে তা তালিকাভুক্ত করুন:
class Phone < ActiveRecord::Base
enum phone_number_type: [:home, :office, :mobile, :fax]
end
এবং এখন আপনি সংখ্যার পরিবর্তে স্ট্রিং নিয়ে কাজ করতে পারেন।
এর পরিবর্তে:
irb(main):001:0> Phone.first.phone_number_type
=> 3
আপনি এটি দেখতে পাবেন:
irb(main):002:0> Phone.first.phone_number_type
=> "fax"
আপনি পরিবর্তন করতে পারেন৷ যে বৈশিষ্ট্য স্ট্রিং বা ints ব্যবহার করে:
irb(main):003:0> phone.phone_number_type = 1; phone.phone_number_type
=> "office"
irb(main):004:0> phone.phone_number_type = "mobile"; phone.phone_number_type
=> "mobile"
অথবা এমনকি একটি ব্যাং পদ্ধতি ব্যবহার করে:
irb(main):005:0> phone.office!
=> true
irb(main):006:0> phone.phone_number_type
=> "office"
আপনার বৈশিষ্ট্যের কিছু নির্দিষ্ট মান আছে কিনা তা জিজ্ঞাসা করার জন্য আপনি পদ্ধতিগুলি পান:
irb(main):007:0> phone.office?
=> true
এবং আপনি সমস্ত খুঁজে পেতে পারেন আপনি যে মানটি খুঁজছেন তার সাথে বস্তু:
irb(main):008:0> Phone.office
Phone Load (0.3ms) SELECT "phones".* FROM "phones" WHERE "phones"."phone_number_type" = ? [["phone_number_type", 1]]
আপনি যদি ব্যবহার করতে পারেন এমন সমস্ত ভিন্ন মান দেখতে চান, যে নম্বরগুলির সাথে তারা যুক্ত আছে, তাহলে phone_number_types
ব্যবহার করুন ক্লাস পদ্ধতি:
irb(main):009:0> Phone.phone_number_types
=> {"home"=>0, "office"=>1, "mobile"=>2, "fax"=>3}
যা তাদের একটি HTML ফর্মে রাখা সহজ করে তোলে:
<div class="field">
<%= f.label :phone_number_type %><br>
<%= f.select :phone_number_type, Phone.phone_number_types.keys %>
</div>
দেখবার কিছু জিনিস
Enums তাদের সমস্যা ছাড়া হয় না, যদিও. আপনি যদি পরে সমস্যায় পড়তে না চান তবে আপনাকে কয়েকটি বিষয় মাথায় রাখতে হবে।
যখন আপনি একটি enum সংজ্ঞায়িত করেন, তখন অর্ডার গুরুত্বপূর্ণ। সুতরাং আপনি যদি আপনার কোডে ফিরে যান এবং সিদ্ধান্ত নেন যে সেই মানগুলি সত্যিই বর্ণানুক্রমিক ক্রমে হওয়া উচিত:
class Phone < ActiveRecord::Base
enum phone_number_type: [:fax, :home, :mobile, :office]
end
আপনার ফোনে আর সঠিক ধরন থাকবে না। আপনি enum
বলে এটির কাছাকাছি যেতে পারেন কোন সংখ্যা কোন মান দিয়ে যায়:
class Phone < ActiveRecord::Base
enum phone_number_type: {fax: 3, home: 0, mobile: 2, office: 1}
end
কিন্তু সত্যিই, আপনার সর্বোত্তম বিকল্প হল অর্ডার সামঞ্জস্যপূর্ণ রাখা।
রেল জগতের বাইরে কী করতে হবে তা হল একটি বড় সমস্যা। যদিও Rails এই enum মানগুলিকে স্ট্রিং হিসাবে দেখে, সেগুলি আপনার ডাটাবেসের ভিতরের সংখ্যা মাত্র। তাই কেউ আপনার কাঁচা ডেটা দেখছে না থাকবে৷ এই সংখ্যাগুলির অর্থ কী তা ধারণা করুন৷ এর মানে হল যে প্রতিটি অ্যাপ যে ডাটাবেসটি পড়বে তাদের সেই enum ম্যাপিং জানতে হবে।
আপনি আপনার enum ম্যাপিং ডাটাবেস বা একটি yaml ফাইলে ডাম্প করতে পারেন যদি আপনার সত্যিই অন্য লোকেদের সেগুলি দেখার প্রয়োজন হয়। তবে এটি শুকনো নয়, কারণ এখন আপনি দুটি জায়গায় আপনার এনাম সংজ্ঞায়িত করছেন। এবং যদি আপনি এতদূর যাচ্ছেন, তাহলে শুরুতে আমরা যা এড়িয়ে যাচ্ছিলাম তা করা আরও ভাল হতে পারে:একটি সম্পূর্ণ আলাদা মডেল এবং অ্যাসোসিয়েশন তৈরি করুন, যাতে একটি ফোন belong_to
একটি ফোন নম্বর টাইপ।
কিন্তু আপনি যদি এটিকে সহজ রাখেন, তাহলে শুরু করার জন্য enums একটি দুর্দান্ত উপায়।
পি.এস. যদি আপনি এটি মিস করেন, রেল অনুশীলন করা রুবি বুক বান্ডেলে অন্তর্ভুক্ত হতে চলেছে, সোমবার, ৬ জুলাই লঞ্চ হচ্ছে৷ এটি এবং অন্যান্য 5টি দুর্দান্ত রুবি বই একটি বিশাল ছাড়ে পান!