2009-10-17 14 views
7

क्या किसी को किसी मणि के बारे में पता है या उपयोगकर्ता को मॉडल में फ़ील्ड जोड़ने की अनुमति देने का अच्छा कार्यान्वयन है?रेल में उपयोगकर्ता निर्दिष्ट गतिशील मॉडल फ़ील्ड

पूर्व।

उपयोगकर्ता संपर्क मॉडल में "आंतरिक नोट्स" फ़ील्ड जोड़ना चाहते हैं। ": पाठ प्रकार"

धन्यवाद

उत्तर

6

मैं माफी चाहता मुझे लगता है कि ऐसा करने के लिए किसी भी प्लगइन का पता नहीं है हूँ इंटरफ़ेस में वे सिर्फ "नई क्षेत्र"> का चयन करेंगे। लेकिन मेरे पास एक कार्यान्वयन सुझाव है।

विचार "डायनामिकफ़िल्फ़" मॉडल जोड़ने का है जो संपर्क मॉडल के साथ है_मैनी संबंध होगा। जब आपके पास संपर्क मॉडल में कोई विधि अनुपलब्ध है, तो आप जांचते हैं कि यदि ऐसा है तो इसे पुनर्प्राप्त करने के लिए कोई गतिशील फ़ील्ड है या नहीं।

class DynamicField < ActiveRecord::Base 
    belongs_to :contact 
end 


class Contact < ActiveRecord::Base 
    has_many :dynamic_fields 

    def method_missing(sym, *args, &block) 
     begin 
      super 
     rescue 
      field = dynamic_fields.find_by_name(sym) 
     end 
     raise ActiveRecord::NoMethodError if field.nil? 
     field.value 
    end 
end 

आप गुण = विधि के साथ आभासी विशेषताएं जोड़ने का तरीका (एक "=" की उपस्थिति का पता लगाने और केवल मूल्य प्राप्त करने की बजाय एक अद्यतन कर रही है) चाहते हैं तो आप एक regex जोड़ने की आवश्यकता होगी। लेकिन आपके पास पहले से ही विचार है।

जब विधि मौजूद नहीं है, तो हम गतिशील फ़ील्ड की जांच करते हैं यदि एक ही नाम वाला कोई है। यदि कोई नहीं है (field.nil?), हम NoMethodError बढ़ाते हैं। अन्यथा, हम इसे वापस कर देते हैं।

तो आप निम्नलिखित के साथ अपने सभी क्षेत्रों की एक सूची प्राप्त कर सकते हैं:

Contact.find(:first).dynamic_fields 

और निम्नलिखित के साथ एक विशिष्ट एक पुनः प्राप्त:

Contact.find(:first).my_dynamic_field 
2

यहाँ यह ऐसा करने का एक और तरीका है।

अस्वीकरण: इस विधि को दुरुपयोग की संभावना के कारण सलाह नहीं दी जाती है। वास्तव में, यह केवल आपकी साइट के प्रशासकों के लिए सुलभ होना चाहिए।

class MyModel < ActiveRecord::Base 
    ... 
    def self.add_column(name, type, args= {}) 
    ActiveRecord::Migration.add_column table_name, name, type, args 
    end 
end 
संबंधित मुद्दे