2010-01-18 7 views
5

मेरे पास लाइफसाइकिल_आईड नामक कॉलम वाला एक टेबल है, और दूसरा लाइफसाइकिल_change_reason कहा जाता है। lifeycle_id आमतौर पर अन्य कारकों के आधार पर सिस्टम द्वारा स्वचालित रूप से बदल जाता है, लेकिन कुछ उपयोगकर्ताओं के पास जीवन चक्र को मैन्युअल रूप से बदलने की क्षमता होती है। यदि वे करते हैं, तो मैं उन्हें परिवर्तन के कारण प्रदान करने की आवश्यकता चाहूंगा, लेकिन मैं उस क्षेत्र को किसी अन्य समय की आवश्यकता नहीं चाहता हूं। क्या किसी के पास कोई सुझाव है कि मैं इस प्रकार के सत्यापन कैसे कर सकता हूं?यदि मैं रेल में अन्य फ़ील्ड संपादित किया गया था तो मैं केवल फ़ील्ड की उपस्थिति को कैसे मान्य करूं?

THX :)

-सी

उत्तर

0

मैं एक जोड़े को अलग अलग तरीकों से देख सकते हैं। मैं सोचता हूं सबसे अच्छा टेबल पर एक और फ़ील्ड जोड़ना होगा जैसे lifecycle_id_original। फिर अपने मॉडल इस तरह कोड में शामिल हैं:

class Member < ActiveRecord::Base 
    belongs_to :lifecycle 

    validates :lifecycle_change_reason, :if => :lifecycle_changed? 

    before_save :reset_original_lifecycle 

    protected 

    def lifecycle_changed? 
    self.life_cycle_id != self.lifecycle_id_original && !self.lifecycle_id_original.nil? 
    end 

    def reset_original_lifecycle 
    self.lifecycle_id_original = self.lifecycle_id 
    end 
end 

जब वस्तु (इस उदाहरण में सदस्य) मान्य है, lifecycle_change_reason केवल आवश्यक हो जाएगा जब मूल और lifecycle_id समान नहीं हैं। मूल के लिए एक शून्य मूल्य भी अनुमति है, क्योंकि यह तब होता है जब एक रिकॉर्ड नव निर्मित किया जाता है।

फिर जब यह सहेजा जाता है, तो "मूल" जीवन चक्र_आईडी से मेल खाने के लिए सेट होता है, इसलिए अगला अपडेट चक्र ठीक से काम करेगा।

यह उतना साफ नहीं है जितना मैं चाहता हूं। मेरा पहला विचार attr_accessor का उपयोग करना था, इसलिए डुप्लिकेट हर समय डीबी में संग्रहीत नहीं किया जा रहा है, लेकिन इसका मतलब यह होगा कि रिकॉर्ड लोड होने पर हर बार उस मूल्य को सेट करना होगा। मैं ActiveRecord मॉडल के लिए किसी ऑन -लोड स्टाइल कॉलबैक से अवगत नहीं हूं।

-1

ऐसा लगता है कि नियंत्रक क्या है। मुझे एहसास है कि लोग तर्क के लिए मॉडल को धक्का देना चाहते हैं, और अच्छे कारण के लिए, लेकिन यहां व्यावहारिक रहें: यदि आपका सिस्टम स्वचालित रूप से यह मान बदल रहा है, और आपके सिस्टम में केवल एक ही बिंदु है जहां कोई इसे मैन्युअल रूप से बदल सकता है, तो यह करता है

if params[:object_name][:life_cycle_id] != @object.life_cycle_id && params[:object_name][:life_cycle_change_reason].blank? 
    flash[:error] = "You must enter a reason for changing the life cycle." 
    redirect_to :back and return false # or whatever 
end 
+0

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

+0

निश्चित रूप से आप जानते हैं कि यह कैसे करें: @ object.errors.add (: life_cycle_change_reason, "प्रदान किया जाना चाहिए।") सरल। – adriandz

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