यह एक पुराना सवाल है, लेकिन मुझे हाल ही में एक ही समस्या का सामना करना पड़ा, इसलिए साझा करने का फैसला किया। हालांकि, मैं ध्यान देना चाहता हूं कि यह प्रति-सत्र समाधान नहीं है, बल्कि प्रति-मॉडल समाधान है।
जैसा कि मुझे पता चला, इसे संभव बनाने के दो तरीके हैं:
1. readonly?
. को फिर से परिभाषित करें
यदि आप मोंगोइड कोड को देखते हैं, तो आप देखेंगे कि सभी फ़ंक्शन जो सहेजते हैं, हटाते हैं या अपडेट करते हैं, कॉल करते हैं readonly?
यह जांचने के लिए कि क्या मॉडल केवल-पढ़ने के लिए है। वास्तव में प्रलेखित नहीं है और इसमें एक खामी है - बनाएं और बनाएं! इस मॉडल पर अनुमति है (नष्ट करें, अपडेट करें, हालांकि सेव नहीं चलेगा)।
private
def readonly?
true
end
2. एक कस्टम कॉलबैक
पिछली विधि के अतिरिक्त आप यह सुनिश्चित करने के लिए कॉलबैक जोड़ सकते हैं कि क्रिएट भी पास नहीं होगा:
before_create :readonly_secret
private
def readonly?
true
end
def readonly_secret
raise Mongoid::Errors::ReadonlyDocument, self.class if readonly?
end
अनिवार्य रूप से, आप readonly?
. से छुटकारा पा सकते हैं विधि पूरी तरह से, और अन्य कॉलबैक जोड़ें जैसे कि before_save
, before_destroy
, before_update
, before_create
"readonliness" में हेरफेर करें
यदि आपको रनटाइम कोड से केवल-पढ़ने की स्थिति में हेरफेर करने की आवश्यकता महसूस होती है, तो आप अपने मॉडल की कक्षा के लिए एक विशेषता परिभाषित कर सकते हैं:
before_create :readonly_secret
class << self
attr_accessor :readonly
end
private
def readonly?
self.class.readonly.nil? ? true : self.class.readonly
end
def readonly_secret
raise Mongoid::Errors::ReadonlyDocument, self.class if readonly?
true
end