मैं एक जोड़े को अलग अलग तरीकों से देख सकते हैं। मैं सोचता हूं सबसे अच्छा टेबल पर एक और फ़ील्ड जोड़ना होगा जैसे 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 मॉडल के लिए किसी ऑन -लोड स्टाइल कॉलबैक से अवगत नहीं हूं।
स्रोत
2010-01-18 16:07:52
इस के साथ समस्या यह है कि आप नहीं में सभी अच्छा प्रमाणीकरण त्रुटि से निपटने मिलता है: नहीं, मेरी राय में, बस कुछ सरल की तरह के साथ अपने नियंत्रक में एक कारण के अस्तित्व को लागू करने के लिए सभी कि ज्यादा जटिलता परिचय फार्म। –
निश्चित रूप से आप जानते हैं कि यह कैसे करें: @ object.errors.add (: life_cycle_change_reason, "प्रदान किया जाना चाहिए।") सरल। – adriandz