रूबी ऑन रेल्स v3.2.8 में, after_initializeActiveRecord कॉलबैक का उपयोग करके , आप अपने मॉडल में एक विधि को कॉल कर सकते हैं जो एक नए ऑब्जेक्ट के लिए डिफ़ॉल्ट मान असाइन करेगा।
after_initialize कॉलबैक को प्रत्येक ऑब्जेक्ट के लिए ट्रिगर किया जाता है जो एक खोजक द्वारा पाया और त्वरित किया जाता है, साथ ही after_initialize को नई वस्तुओं के तुरंत बाद ट्रिगर किया जाता है ( ActiveRecord Callbacks देखें )।
तो, IMO यह कुछ इस तरह दिखना चाहिए:
class Foo < ActiveRecord::Base
after_initialize :assign_defaults_on_new_Foo
...
attr_accessible :bar
...
private
def assign_defaults_on_new_Foo
# required to check an attribute for existence to weed out existing records
self.bar = default_value unless self.attribute_whose_presence_has_been_validated
end
end
Foo.bar = default_valueइस उदाहरण के लिए जब तक कि attribute_whose_presence_has_been_validatedपहले से सेव / अपडेट पर उदाहरण न हो । default_valueतो प्रपत्र का उपयोग कर प्रस्तुत करने के लिए अपने दृश्य के साथ संयोजन के रूप में इस्तेमाल किया जाएगा default_valueके लिए barविशेषता।
सबसे अच्छा यह hacky है ...
EDIT - 'new_record?' का उपयोग करें यह जांचने के लिए कि क्या नए कॉल से तत्काल
किसी विशेषता मान की जाँच करने के बजाय, new_record?अंतर्निहित पद्धति का उपयोग रेल के साथ करें। तो, उपरोक्त उदाहरण को इस तरह दिखना चाहिए:
class Foo < ActiveRecord::Base
after_initialize :assign_defaults_on_new_Foo, if: 'new_record?'
...
attr_accessible :bar
...
private
def assign_defaults_on_new_Foo
self.bar = default_value
end
end
यह बहुत क्लीनर है। आह, रेल का जादू - यह मुझसे ज्यादा चालाक है।