रेल 3 में निहित डेटाबेस

वास्तविक लोगों के साथ घटित (घटित) वास्तविक घटनाओं के आधार पर।

यदि आप विरासत डेटाबेस के साथ काम करते हैं, तो आप हमेशा फ़ील्ड नामों को बदलने में सक्षम नहीं हो सकते हैं जब रूबी पर रूबी के साथ फ़ील्ड विरोध करना शुरू करते हैं। सबसे सरल उदाहरण आपके टेबल में से एक में 'क्लास' नामक फ़ील्ड है। रेल वास्तव में यह पसंद नहीं है। यह एक सास की तरह है जो आपके नए केश को पसंद नहीं करती है, और जब भी संभव हो, वह इस पर ध्यान देती है।
नाटकीय प्रतिभा की कमी के कारण, अनुवादक एक तेज रूपक उत्पन्न करने में असमर्थ था, जो एक सामान्य संघ बनाता है, एक निजी के विपरीत।


#      ruby-1.9.2-p0 > u = User.new :class => '1995' NoMethodError: undefined method `columns_hash' for nil:NilClass 

 #   ,    ,       . ruby-1.9.2-p0 > u = User.new :name NoMethodError: undefined method `has_key?' for nil:NilClass 

 #     ruby-1.9.2-p0 > u = User.new => #<User id: nil, name: nil, class: nil, created_at: nil, updated_at: nil> ruby-1.9.2-p0 > u.class = '1995' NoMethodError: undefined method `private_method_defined?' for nil:NilClass 

ऊपर की सास की तरह, आपकी समस्याएं तब तक अपरिहार्य हैं जब तक कि केश तय नहीं हो जाता।
सौभाग्य से, ब्रायन जोन्स ने अपने रत्न safe_attributes के साथ हमारे लिए इस समस्या को हल किया। ActiveRecord मॉडल तालिका में प्रत्येक विशेषता के लिए रेल स्वचालित रूप से प्रोसेसर (गेटर्स और सेटर) बनाती है। "क्लास" जैसे महत्वपूर्ण तरीकों के साथ रेल को ओवरराइड करने की कोशिश करना हमें परेशानियों का कारण बनता है। Safe_attributes खतरनाक नामों के साथ किसी भी विशेषता के निर्माण को शामिल नहीं करता है।

यह निम्नलिखित करने के लिए पर्याप्त है:
 # app/models/user.rb class User < ActiveRecord::Base bad_attribute_names :class end 

बंडल में मणि जोड़ने के बाद, घुसपैठिए फ़ील्ड नामों की सूची bad_attribute_names को पास करें, और यह रेल को उनके लिए प्रोसेसर विधियों को बनाने की कोशिश से मुक्त करेगा। अब सब कुछ काम करता है, लेकिन इन प्रोसेसर के बिना। आइए हमारी विशेषता को प्राप्त / असाइन करने का प्रयास करें: वर्ग:
 ruby-1.9.2-p0 > u = User.new => #<User id: nil, name: nil, class: nil, created_at: nil, updated_at: nil> ruby-1.9.2-p0 > u.class = '1995' => "1995" ruby-1.9.2-p0 > u => #<User id: nil, name: nil, class: "1995", created_at: nil, updated_at: nil> ruby-1.9.2-p0 > u.class => User(id: integer, name: string, class: string, created_at: datetime, updated_at: datetime) 

सेटर काम करता है (मेरा मानना ​​है कि यह इसलिए भी बनाया गया था क्योंकि पहले से मौजूद 'क्लास' = विधि नहीं थी), और हम यह सुनिश्चित कर सकते हैं कि विशेषता मान सही तरीके से असाइन किया गया है। लेकिन डिफ़ॉल्ट गेट्टर कॉल करने का कारण ... ठीक है, डिफ़ॉल्ट व्यवहार।

तथ्य यह है कि आप हमेशा हैश (संबद्ध सरणी, फिर हैश, लगभग। अनुवादक) के संदर्भ में एक विशेषता का उपयोग कर सकते हैं। आप हैश ऑब्जेक्ट के लिए एक कुंजी / मान पास कर सकते हैं, और यह काम करेगा। इसका मतलब है कि बनाते और अद्यतन करते समय आपके नियंत्रक को बदलना नहीं पड़ता है।
नए, बनाने, update_attribute, update_attributes, आदि जैसे तरीके ठीक काम करेगा।

यदि आप केवल एक मान निर्दिष्ट करना चाहते हैं (उदाहरण के लिए तत्काल बचत से बचने के लिए), तो निम्नानुसार करें।
 ruby-1.9.2-p0 > u[:class] = '1996' => "1996" ruby-1.9.2-p0 > u => #<User id: nil, name: nil, class: "1996", created_at: nil, updated_at: nil> 


सामान्य तौर पर, आप रेल-जेनरेट किए गए प्रोसेसर का उपयोग करने के बजाय सीधे विशेषताओं का मूल्य निर्धारित कर सकते हैं। लेकिन हम अभी भी अंतिम निर्णय से एक कदम दूर हैं। हम इस विशेषता को शेष के रूप में संदर्भित करना चाहते हैं, और इसके लिए हमें एक्सेस विधियों (गेटर्स और सेटर्स) के एक सामान्य सेट को व्यवस्थित करना होगा। ऐसा करने का एक कारण यह है कि इस विशेषता के मानक सत्यापन हमारे लिए उपलब्ध होंगे।

आप इस उदाहरण में प्रोसेसर जोड़ सकते हैं:
 # add to app/models/user.rb def class_name= value self[:class] = value end def class_name self[:class] end 

हम प्रोसेसर को 'class_name' घोषित करते हैं, और अब हम इसे मूल विशेषता नाम के बजाय कहीं भी उपयोग कर सकते हैं। हम इसका उपयोग रूपों में कर सकते हैं:
 <%= f.text_field :class_name %> 

या सत्यापनकर्ताओं में:
 validates_presence_of :class_name 

या जब हम एक नई वस्तु बनाते हैं:
 User.create :class_name => 'class of 1995' 

यदि आपने कोड डाउनलोड किया है, तो ये ऐड-ऑन परीक्षण-चालित हैं, जिसका अर्थ है कि मैंने इन विधियों के लिए परीक्षण स्वयं लिखने से पहले किया था, ताकि यह सुनिश्चित हो सके कि ये विधियाँ ठीक से काम करती हैं। मैं आपसे यही करने का आग्रह करता हूं।

सौभाग्य है

मूल उपलब्ध है

Source: https://habr.com/ru/post/In155215/


All Articles