ruby on rails - ActiveModel:: MissingAttributeError तैनाती के बाद होती है और फिर थोड़ी देर बाद चली जाती है




ruby-on-rails (5)

मेरे पास एक रेल 3.0.9 ऐप है, जिसे एक बार तैनात करने के बाद, वह ActiveModel के एक गुच्छा से पीड़ित हो जाता है :: MissingAttributeErrors कि फसल 500s पैदा करती है। त्रुटियां काफी अनियमित रूप से घटित होती हैं, कभी-कभी एक पृष्ठ लोड होगा, अन्य बार ऐसा नहीं होगा, लेकिन विशेषताएँ डेटाबेस में सभी मौजूदा विशेषताएँ हैं और इन्हें ढूंढा जाना चाहिए।

अजीब हिस्सा यह है कि थोड़ी देर के बाद, त्रुटियां दूर हो जाती हैं। अचानक, वे एक मुद्दा पैदा करना बंद कर देते हैं।

मैंने इसके समाधान के बारे में खोज की है, लेकिन यह त्रुटि ज्यादातर तब होती है जब किसी ने Model.all(:select => 'column_x,column_y') और column_z लिए कॉल कर रहे हैं या जब वे cache_money का उपयोग कर रहे हैं। मैं इनमें से कुछ भी नहीं कर रहा हूं।

क्या कोई मदद कर सकता है?


आपके पास शायद एक ऐसी क्वेरी है जो सभी कॉलम (यानी उपयोग :select ) और फिर cache_money नहीं लौटाती है; या कुछ अन्य ActiveRecord प्लगइन एक after_initialize कॉलबैक का उपयोग करता है, जो जब भी कोई नया ActiveRecord ऑब्जेक्ट बनाया जाता है (यानी जब डेटाबेस से लाया जाता है) का उपयोग करता है।

उस कॉलबैक को इनिशियलाइज़ करने में, कुछ उस विशेषता को एक्सेस या उपयोग करने की कोशिश करता है जो इसमें शामिल नहीं थी :select । आप उस विशेषता के लिए शून्य वापस करने की अपेक्षा करेंगे, लेकिन इसके बजाय ActiveRecord :: MissingAttributeError को फेंक दिया जाता है।

आप ActiveRecord को बचाव कर सकते हैं :: MissingAttributeError जैसे लेख में सुझाव दिया गया है, या प्लगइन का उपयोग करने के लिए प्लगइन (ओं) को पैच करें ( has_attribute?(:attribute_name)


आपको लाइन जोड़ने की आवश्यकता है

rescue ActiveRecord::MissingAttributeError 

अपने after_initialize () मॉडल की विधि


मुझे इस पर एक दिलचस्प लग रहा था जिसके परिणामस्वरूप एक ही त्रुटि हुई। कोड का पुन: उपयोग करने के प्रयास में, हम एक प्रस्तुतकर्ता वर्ग के साथ एक प्रस्तुतकर्ता वर्ग को उपवर्गित करते हैं जिसने एक ग्राफ़ दृश्य में उपयोग करने के लिए समूहीकरण किया।

सरल बनाने के लिए, यह कुछ इस तरह था:

class PostPresenter 
  def query
    Post.where(...stuff....).includes(:wombat)
  end
end

एग्रीगेटर ने प्रति दिन पोस्ट की एक तालिका बनाने के लिए कुछ इस तरह किया:

class AggregatePostPresenter < PostPresenter
  def group_query
    query.select('count(*) as cnt, date(created_at)').group('date(created_at)')
  end
end

ActiveModel में "group_query" परिणामों के लिए कॉल :: MissingAttributeError के बाद से, मुझे लगता है, "Wombat विफल" शामिल करने का प्रयास क्योंकि "wombat_id" "चयन" में शामिल विशेषताओं में नहीं था।

यह शायद आपका जवाब नहीं है, हालांकि, चूंकि यह होता है चाहे कैश सक्षम हो या न हो।


मैंने इस मुद्दे का सामना किया। सुनिश्चित करें कि आपका select: आपके विचार में संदर्भित सभी फ़ील्ड शामिल हैं, जिसमें किसी भी रिश्ते की आईडी और आपके तरीकों के भीतर बुलाए गए किसी भी गुण शामिल हैं।

जब भी आपके विचार और रिश्ते जटिल हों, तो लापता विशेषता को पहचानना मुश्किल हो सकता है। यह डिबग करने का सबसे आसान तरीका है कि आपके क्लॉज़ के select हिस्से को हटा दें और देखें कि क्वेरी / स्कोप / विधि सही तरीके से चलती है या नहीं। यदि ऐसा है, तो सभी विशेषताओं को select और अनावश्यक विशेषताओं को एक-बार-बार हटा दें जब तक कि आप अपमानजनक विशेषता नहीं पाते हैं।


यदि आपके पास केवल किसी भी deploys या सर्वर पुनरारंभ किए बिना अपने डेटाबेस को अपडेट करने के बाद सीधे यह मुद्दा रहा है, तो मेरे लिए जो काम किया गया है वह आपके लिए काम कर सकता है:

heroku restart और इसे ठीक किया जाना चाहिए। इससे पहले कि dyno पुनरारंभ होता है पुराना डेटा कभी-कभी सर्वर पर कैश्ड रहता है, इसलिए इसे फिर से शुरू करने से उस सभी डेटा को साफ़ किया जाएगा और उस तरह की त्रुटियों को पैदा होने से रोका जा सकेगा। उम्मीद है की यह मदद करेगा।