কম্পিউটার টিউটোরিয়াল

আপনার মডেল সরল করুন: স্পষ্ট, পঠনযোগ্য অ্যাট্রিবিউটের জন্য ActiveRecord Enums ব্যবহার

एक ऐसे प्रश्न की कल्पना करें जो "पेंडिंग", "अप्रूव्ड", या "फ्लैग्ड" हो सकता है। या एक फोन नंबर जो "होम", "ऑफिस", "मोबाइल", या "फैक्स" हो (अगर यह 1982 है)।

कुछ मॉडल इस तरह के डेटा की मांग करते हैं। एक ऐसा एट्रिब्यूट जो केवल कुछ अलग-अलग मानों में से एक हो सकता है। और मानों का वह सेट लगभग कभी नहीं बदलता।

यह एक ऐसी स्थिति है जहां, अगर यह सादा रूबी होता, तो आप बस एक सिंबल का उपयोग करते।

आप एक PhoneNumberType या QuestionStatus मॉडल और इन मानों को रखने के लिए एक belongs_to रिलेशनशिप बना सकते हैं, लेकिन यह इसके लायक नहीं लगता। आप उन्हें एक YAML फाइल में भर सकते हैं, लेकिन अब आपको यह पता लगाने के लिए पूरी तरह से अलग जगह देखनी होगी कि आपका ऑब्जेक्ट क्या कर सकता है।

4.1 में, रेल्स ने ActiveRecord enums के साथ इस समस्या को हल करने का प्रयास किया।

मॉडल में कुछ मान

ActiveRecord enums काफी आसान हैं। आप अपने मॉडल को एक integer कॉलम देते हैं:

bin/rails g model phone number:string phone_number_type:integer

उन मानों को सूचीबद्ध करें जो वह एट्रिब्यूट ले सकता है:

app/models/phone.rb
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"

आप उस एट्रिब्यूट को या तो स्ट्रिंग्स या इंट्स का उपयोग करके बदल सकते हैं:

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 फॉर्म में डालना आसान बनाता है:

app/views/phones/_form.html.erb
<div class="field"> <%= f.label :phone_number_type %><br> <%= f.select :phone_number_type, Phone.phone_number_types.keys %> </div>

আপনার মডেল সরল করুন: স্পষ্ট, পঠনযোগ্য অ্যাট্রিবিউটের জন্য ActiveRecord Enums ব্যবহার

कुछ बातों का ध्यान रखें

Enums अपनी समस्याओं के बिना नहीं हैं, हालांकि। यदि आप बाद में मुसीबत में नहीं पड़ना चाहते हैं तो आपको कुछ बातों को ध्यान में रखना होगा।

जब आप एक enum परिभाषित करते हैं, तो क्रम मायने रखता है। इसलिए यदि आप अपने कोड पर वापस जाते हैं और तय करते हैं कि उन मानों को वास्तव में वर्णानुक्रम में होना चाहिए:

app/models/phone.rb
class Phone < ActiveRecord::Base enum phone_number_type: [:fax, :home, :mobile, :office] end

आपके फोन के पास अब सही प्रकार नहीं होंगे। आप enum को बता सकते हैं कि कौन सा नंबर किस मान के साथ जाता है:

app/models/phone.rb
class Phone < ActiveRecord::Base enum phone_number_type: {fax: 3, home: 0, mobile: 2, office: 1} end

लेकिन वास्तव में, आपका सबसे अच्छा विकल्प क्रम को सुसंगत रखना है।

एक बड़ी समस्या यह है कि रेल्स की दुनिया के बाहर क्या करना है। भले ही रेल्स इन enum मानों को स्ट्रिंग्स के रूप में देखता है, वे आपके डेटाबेस के अंदर सिर्फ नंबर हैं। इसलिए आपके रॉ डेटा को देखने वाले किसी व्यक्ति को कोई अंदाजा नहीं होगा कि उन नंबरों का क्या मतलब है। इसका यह भी अर्थ है कि उस डेटाबेस को पढ़ने वाला हर ऐप को उस enum मैपिंग को जानना होगा।

यदि आपको वास्तव में अन्य लोगों को उन्हें देखने की आवश्यकता है, तो आप अपने enum मैपिंग को डेटाबेस या YAML फाइल में डंप कर सकते हैं। लेकिन यह DRY नहीं है, क्योंकि अब आप अपने enum को दो जगहों पर परिभाषित कर रहे हैं। और यदि आप उस हद तक जा रहे हैं, तो शायद वही करना बेहतर होगा जिसे हम शुरुआत में टाल रहे थे: एक पूरी तरह से अलग मॉडल और असोसिएशन बनाएं, ताकि एक Phone belong_to एक PhoneNumberType करे।

लेकिन अगर आप इसे सरल रख रहे हैं, तो enums शुरू करने का एक शानदार तरीका है।

पी.एस. यदि आप चूक गए हैं, तो Practicing Rails सोमवार, 6 जुलाई को लॉन्च होने वाले Ruby Book Bundle में शामिल होने जा रहा है। इसे और 5 अन्य बेहतरीन रूबी किताबें भारी छूट पर प्राप्त करें!

  1. Tkinter-এ ব্রাউজ বাটন তৈরি করার পদ্ধতি

  2. ৬টি সহজ ট্রিক দিয়ে Chrome দ্রুত করার উপায়

  3. নতুন এন্ড্রয়েড ফোন অপ্টিমাইজ করার ১৫টি απαরিহার্য টিপস

  4. আকুয়ারিস ই৪.৫ উবুন্টু ফোনকে অ্যান্ড্রয়েডে রূপান্তর: একটি ব্যক্তিগত রূপান্তর গाथা