मैं इस मणि का उपयोग कर रहा हूँ (https://github.com/latortuga/has_magic_columns) मेरे ग्राहकों को कस्टम परिभाषित करने की अनुमति देने के लिएप्रति-खाता स्तर पर विशेषताएँ। जैसे आदेश ऑब्जेक्ट के लिए, ग्राहक A विशेषताओं के रूप में "फ़ील्ड 1", "फ़ील्ड 2" में जोड़ सकता है, जबकि ग्राहक बी "फ़ील्ड 3" और "फ़ील्ड 4" में जोड़ सकते हैं, मेरे बिना उन्हें आदेश तालिका में वास्तविक कॉलम के रूप में जोड़ सकते हैं।
इस मणि ने पिछले रेल 3 काम करना बंद कर दिया। मैंने मणि कोड डाउनलोड किया, और इसके साथ कुछ मामूली मुद्दों को तय किया, और रल्स 4.2 को समर्थन देने के लिए रत्नों को अपग्रेड किया, लेकिन मैं मुख्य मुद्दे पर अटका हुआ हूं, जो कि इस तरह की असफलताओं में परिलक्षित होता है:
अद्यतन स्टैकट्रेस:
1) HasMagicColumns on a single model allows setting and saving of magic attributes
SystemStackError:
stack level too deep
# /Users/testuser/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/associations/through_association.rb:6:in `through_reflection"
# /Users/testuser/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/associations/through_association.rb:68:in `stale_state"
# /Users/testuser/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/associations/association.rb:76:in `stale_target?"
# /Users/testuser/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/associations/collection_association.rb:32:in `reader"
# /Users/testuser/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/associations/builder/association.rb:115:in `magic_attributes"
# ./lib/has_magic_columns/active_record.rb:162:in `find_magic_attribute_by_column"
# ./lib/has_magic_columns/active_record.rb:142:in `block in initialize_magic_columns"
# /Users/testuser/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/delegation.rb:46:in `each"
# /Users/testuser/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/delegation.rb:46:in `each"
# ./lib/has_magic_columns/active_record.rb:141:in `initialize_magic_columns"
# ./lib/has_magic_columns/active_record.rb:113:in `rescue in method_missing"
# ./lib/has_magic_columns/active_record.rb:107:in `method_missing"
# /Users/testuser/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/persistence.rb:240:in `update_attribute"
# ./lib/has_magic_columns/active_record.rb:154:in `block in initialize_magic_columns"
# /Users/testuser/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/delegation.rb:46:in `each"
# /Users/testuser/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.7.1/lib/active_record/relation/delegation.rb:46:in `each"
उत्तर:
जवाब के लिए 2 № 1वह मणि बहुत पुरानी और अचूक है। जैसा कि रीडमी कहते हैं, यह मूल रूप से एक रेल्स 2 प्लगइन के रूप में लिखा गया था और फिर रेल 3 में उपयोग के लिए एक रत्न के रूप में पैक किया गया था।
जब तक आप "एक महत्वपूर्ण पुनर्लेखन की योजना नहीं बनाते हैं, तब तक मैं केवल" परीक्षण त्रुटियों को दूर करने और इसे काम करने के लिए प्राप्त करने की सिफारिश नहीं करूंगा।
बल्कि, आप रेल 4.2 द्वारा प्रदान की गई नई क्षमताओं का उपयोग क्यों नहीं करते हैं?
यदि आप PostgreSQL का उपयोग कर रहे हैं, तो रेल 4 देशी कॉलम प्रकारों का समर्थन करता है hstore
तथा JSON
:
http://guides.rubyonrails.org/v4.2/active_record_postgresql.html
यदि आप "PostgreSQL पर नहीं हैं, तो आप अभी भी क्रमबद्ध विशेषताओं का उपयोग कर सकते हैं: http://api.rubyonrails.org/v4.2/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize
अगर तुम वास्तव में एक मुखौटा इंटरफ़ेस की आवश्यकता है जो वास्तविक मॉडल विशेषताओं का भ्रम देता है, आप या तो आसानी से कर सकते हैं method_missing
या आप किस के शीर्ष पर मणि को फिर से लागू कर सकते हैंमैं ऊपर जुड़ा हुआ हूँ। मैं यह नहीं सोचता कि आपको उनकी आवश्यकता है, क्योंकि यदि आपके ग्राहक कस्टम विशेषताओं को परिभाषित कर सकते हैं, तो मुझे नहीं लगता कि आपके कोड ने उन्हें कहीं भी हार्डकोड किया है।