तो, सोचा कि मैंने कल रात यह काम किया था, इसे शपथ ली थी। अब यह कोई काम नहीं है, और मुझे मदद के लिए समय के बारे में पता चलता है।रेलवे पर गतिशील विशेषता फ़ील्ड डीबी से method_missing समस्याओं का उपयोग कर
डेटाबेस, अर्द्ध EAV शैली मेंइम परिभाषित गतिशील क्षेत्र, और की सुविधा देता है बस अभी राज्य मैं ध्यान न चाहे EAV एक अच्छा विचार है पर अपनी राय सुनने के लिए है या नहीं :)
फिर भी मैं यह एक छोटे कर अतीत में किए गए Ive से अलग, मूल रूप से जब कोई विशेषता (या फ़ील्ड) जोड़ा जाता है, तो मैं किसी विशेष विशेषता तालिका माइग्रेशन में एक एड कॉलम बनाता हूं और इसे चलाता हूं (या इसे हटा देता हूं) - किसी भी तरह, क्योंकि एक श्रेणी परत है बीच में बैठे जो प्रत्यक्ष संबंध हैं जहां सभी विशेषताओं को परिभाषित किया गया है, मैं वास्तविक विशेषता नाम को कॉलम नाम के रूप में उपयोग नहीं कर सकता, क्योंकि गुण श्रेणी विशिष्ट हैं।
इसलिए, यह आप
Entity
belongs_to :category
Category
has_many :entities
EntityAttribute
belongs_to :category
EntityAttributeValue
belongs_to :entity_attribute
belongs_to :entity
कल्पना में मदद करता है और EAV तालिका क्षैतिज तक फैला के रूप में नई विशेषताओं लेबल attribute_1 attribute_2 कॉलम है, जो कि विशेष रूप से इकाई के लिए मान होने के साथ बनाया जाता है, अगर।
फिर भी - मैं तरीकों इकाई मॉडल पर गतिशील बनाने के लिए कोशिश कर रहा हूँ, इसलिए मैं नहीं बल्कि
यहाँ entity.entity_attribute_value.field_5 @ से @ entity.actual_attribute_name कॉल कर सकते हैं, कोड मैंने सोचा था कि काम कर रहा था है - -
def method_missing(method, *args)
return if self.project_category.blank?
puts "Sorry, I don't have #{method}, let me try to find a dynamic one."
puts "let me try to find a dynamic one"
keys = self.project_category.dynamic_fields.collect {|o| o.name.to_sym }
if keys.include?(method)
field = self.project_category.dynamic_fields.select { |field| field.name.to_sym == method.to_sym && field.project_category.id == self.project_category.id }.first
fields = self.project_category.dynamic_field_values.select {|field| field.name.to_sym == method }
self.project_category_field_value.send("field_#{field.id}".to_sym, *args)
end
end
तो आज के रूप में मैं वापस कोड के लिए गया था, मुझे एहसास हुआ, हालांकि मैं रेल कंसोल में विशेषता सेट कर सकते हैं, और यह सही क्षेत्र वापसी होगी, जब मैं रिकॉर्ड को सहेज लिया, EntityAttributeValue अद्यतन नहीं किया जा रहा था (self.project_category_field_value के रूप में प्रतिनिधित्व किया गया है।)
तो इसे देखने के बाद और ऐसा लगता है कि मुझे पहले से ही एप्यूपेट जोड़ना था या पहले से ही विशेषता को सहेजने के लिए कॉलबैक को पहले से सहेजना था, और जहां मैंने देखा, कॉलबैक में, यह method_missing कॉलबैक चलाएगा, जैसे कि ऑब्जेक्ट था डुप्लीकेट किया जा रहा है (और नई वस्तु मूल वस्तु की प्रति थी), या कुछ, मुझे पूरा यकीन नहीं है। लेकिन कुछ समय पर सहेजने की प्रक्रिया या पहले, मेरी विशेषता विस्मरण में गायब हो जाती है।
तो, मुझे लगता है कि मैंने इसे टाइप करने के बाद अपने स्वयं के प्रश्न का आधा रास्ता जवाब दिया है, मुझे एक इंस्टेंस वैरिएबल सेट करने की आवश्यकता है और यह देखने के लिए जांचें कि क्या यह मेरी method_missing विधि (दाएं?) की शुरुआत में मौजूद है या नहीं, शायद यह नहीं है ऐसा नहीं हो रहा है, लेकिन मैं यह भी पूछ रहा हूं कि क्या करने का एक बेहतर तरीका है जो मैं करने की कोशिश कर रहा हूं।
और यदि विधि_मissing का उपयोग करना एक बुरा विचार है, तो कृपया बताएं कि क्यों, गायब विधि के बारे में पदों के माध्यम से मैंने कुछ लोगों को यह कहते हुए सुना है, लेकिन उन लोगों में से एक ने उचित स्पष्टीकरण की पेशकश करने पर परेशान नहीं किया क्योंकि विधि गायब क्यों खराब समाधान था ।
अग्रिम धन्यवाद।
प्रतिक्रिया के लिए धन्यवाद, मैं इसे उपरोक्त कोड के माध्यम से अकेले काम करने में सक्षम नहीं था, लेकिन मैंने इसे कुछ रिफैक्टरिंग में इस्तेमाल किया, इसलिए मैंने जवाब देने के लिए उत्तर – thrice801