2011-09-05 16 views
12

क्या मोंगोइड में एक मॉडल के लिए एक सेटर या गेटटर को ओवरराइड करने का कोई तरीका है? की तरह कुछ:एक मोंगोइड मॉडल के सेटर्स और गेटर्स को ओवरराइड करें

class Project 
    include Mongoid::Document 
    field :name, :type => String 
    field :num_users, type: Integer, default: 0 
    key :name 
    has_and_belongs_to_many :users, class_name: "User", inverse_of: :projects 

    # This will not work 
    def name=(projectname) 
    @name = projectname.capitalize 
    end 
end 

जहां name विधि आभासी क्षेत्रों का उपयोग किए बिना ओवरराइट किया जा सकता?

+0

संबंधित: http://stackoverflow.com/questions/6699503/mongoid-custom-setters-getters-and-super – marcgg

उत्तर

16
def name=(projectname) 
    self[:name] = projectname.capitalize 
end 
+1

@ user923636 आप एक बार बनाए गए दस्तावेज़ के "_id" फ़ील्ड को नहीं बदल सकते हैं। इसलिए यदि प्रोजेक्ट का नाम बदल जाता है, तो आपको पुराने दस्तावेज़ को हटाना होगा और बदले गए नाम के साथ एक नया बनाना होगा। – rubish

23
उपयोग

बेहतर

def name=(projectname) 
    super(projectname.capitalize) 
end 

विधि

self[:name] = projectname.capitalize 

, खतरनाक हो सकता है इसके साथ अधिक भार अंतहीन प्रत्यावर्तन का कारण बन सकती

+1

धन्यवाद मुझे स्वयं से रिकर्सन मिला [: नाम]। सुपर वर्क्स – GTDev

+0

@ गियरहेड मैंने सुपर ओवर टाइममे (यह बेहतर दिखता है) पर भी स्विच किया है, हालांकि मेरे कोड के कुछ भाग स्वयं [: नाम] नोटेशन का उपयोग करते हैं और अब तक किसी भी पुनरावर्तन का सामना नहीं किया है। – rubish

+2

कोई सुपर क्लास नहीं होने पर 'सुपर' कैसे काम कर सकता है? 'Mongoid :: दस्तावेज़' को मॉड्यूल के रूप में शामिल किया गया है, मैं यहां उलझन में हूं ... – tothemario

1

मैं ओवरराइड करने के लिए की आवश्यकता होगी, के साथ एक समान मुद्दा था कारण संबंधित उपयोगकर्ता के लिए "उपयोगकर्ता" सेटटर: उपयोगकर्ता संबंध। मैं इस समाधान के साथ न केवल इस मामले के लिए आया था, लेकिन उसी वर्ग के भीतर पहले से परिभाषित किसी भी विधि को लपेटने के लिए।

class Class 
    def wrap_method(name, &block) 
    existing = self.instance_method(name) 

    define_method name do |*args| 
     instance_exec(*args, existing ? existing.bind(self) : nil, &block) 
    end 
end 

यह आप अपने मॉडल कक्षा में निम्न कार्य करने की अनुमति देता है:

wrap_method :user= do |value, wrapped| 
    wrapped.call(value) 
    #additional logic here 
end 
+0

बिल्कुल वही जो मैं खोज रहा था, और अच्छा समाधान। +1 – user2398029

+0

साइकिल को फिर से शुरू करने की कोशिश मत करो। इसके लिए alias_method_chain का उपयोग करें। – sandrew

+0

इसके लिए धन्यवाद! संबंध सेटर्स और गेटर्स के साथ भी परेशानी हो रही है। सैंड्रू की टिप्पणी ने मुझे a_m_c में देखा था और मैंने रूबी 2.0 के मॉड्यूल # प्रीपेन्ड के बारे में सीखा। महान समाधान और वास्तव में साफ - http://dev.af83.com/2012/10/19/ruby-2-0-module-prepend.html –

संबंधित मुद्दे