मेरे पास मेरे फॉर्म में 3 फ़ील्ड हैं जो मेरे डेटाबेस में नहीं हैं: opening_type, opening_hours, opening_minutes। मैं इन 3 क्षेत्रों के साथ मुख्य विशेषता "खोलने" (डेटाबेस में) को अद्यतन करना चाहता हूं।रेल - मॉडल में नहीं विशेषताएँ और मॉडल विशेषता अद्यतन करें
मैंने बहुत सी चीजों की कोशिश की जो काम नहीं करते हैं।
वास्तव में मेरे पास है:
attr_accessor :opening_type, :opening_hours, :opening_minutes
def opening_type=(opening_type)
end
def opening_type
opening_type = opening.split("-")[0] if !opening.blank?
end
def opening_hours=(opening_hours)
end
def opening_hours
opening_hours = opening.split("-")[1] if !opening.blank?
end
def opening_minutes=(opening_minutes)
end
def opening_minutes
opening_minutes = opening.split("-")[2] if !opening.blank?
end
मैं की तरह कुछ जोड़ने की कोशिश की:
def opening=(opening)
logger.info "WRITE"
if !opening_type.blank? and !opening_hours.blank? and opening_minutes.blank?
opening = ""
opening << opening_type if !opening_type.blank?
opening << "-"
opening << opening_hours if !opening_hours.blank?
opening << "-"
opening << opening_minutes if !opening_minutes.blank?
end
write_attribute(:opening, opening)
end
def opening
read_attribute(:opening)
end
लेकिन, accessors पद्धतियों को बुलाया नहीं कर रहे हैं और मुझे लगता है कि opening_type, OPENING_HOURS, opening_minutes भी खाली थे accessors कहा जाता था ...
मुझे लगता है कि मुझे पहले से बचाए कॉलबैक की आवश्यकता नहीं है और इसे एक्सेसर्स को फिर से लिखना चाहिए।
नोट्स: - रेल 3.0.5, - opening_type,: OPENING_HOURS,: opening_minutes खाली
संपादित किया जा सकता है: मैं अपने कोड
नोट करें यह उत्तर मानता है कि आप केवल डेटाबेस में संयुक्त 'उद्घाटन' फ़ील्ड को स्टोर करना चाहते हैं। एक और दृष्टिकोण डाटाबेस में अलग-अलग घटकों को स्टोर करना और मांग पर गतिशील रूप से संयुक्त स्ट्रिंग बनाना होगा। आपकी आवश्यकताओं के आधार पर जो आपके लिए बेहतर दृष्टिकोण भी हो सकता है। – Gareth
मुझे यह डेटाबेस खोलने वाले क्षेत्र के साथ मिलता है। यह डेटाबेस एक स्मार्टफोन ऐप के साथ सिंक करता है और मैं 3 अलग-अलग क्षेत्रों को स्टोर करने के लिए अपनी संरचना नहीं बदल सकता। ;-) पहले_विधीकरण कॉलबैक के साथ समस्या यह है कि जब आप फॉर्म को संपादित करने जा रहे हैं तो आप मामले को संभाल नहीं सकते ... और जहां मुझे फॉर्म के लिए 3 वर्र्स में उद्घाटन क्षेत्र को छोटा करने की आवश्यकता है। मुझे पता है कि मैं इसे मैन्युअल रूप से कर सकता हूं लेकिन मैंने सोचा कि एक्सेसर्स के साथ ऐसा करने के लिए एक बेहतर तरीका था ... –
सभी सच है, लेकिन 'उद्घाटन =' ओवरराइड करने का आपका सुझाव बहुत सी चीजें तोड़ देगा। साथ ही, यह एक बहुत ही स्केची विचार है जिसमें एक सेटर विधि है जो पूरी तरह से पारित पैरामीटर को त्याग देता है। एक अलग विधि (जैसे कि 'set_opening') के लिए बेहतर है जो यह स्पष्ट करता है कि यह क्या कर रहा है। आपके पास उस विधि को कॉल करने के लिए पहले_अधिकृतता का उपयोग करने के लिए * नहीं है लेकिन मैं गंभीरता से अनुशंसा करता हूं कि यह एक अलग विधि है – Gareth