2009-03-30 7 views
8

मेरे पास एक ऐसा फॉर्म है जो एकाधिक पृष्ठों को फैलाता है। जिस तरह से इसे स्थापित किया गया है वह आदर्श नहीं है क्योंकि यह सबमिट होने पर प्रत्येक पृष्ठ को (डेटाबेस में) सहेजता है। इसलिए यदि उपयोगकर्ता सभी पृष्ठों पर फ़ॉर्म को पूरा नहीं करता है तो डेटाबेस में एक अधूरा उपयोगकर्ता पंजीकरण सहेजा जाएगा।क्या डेटाबेस लेन-देन रेल में कई अनुरोधों का विस्तार करना संभव है?

यदि उपयोगकर्ता पूरी तरह से फॉर्म भर नहीं लेता है तो मैं सहेजता हूं 'सहेजना' चाहता हूं।

तो क्या एक लेनदेन स्थापित करने का कोई तरीका है जो तब शुरू होगा जब उपयोगकर्ता अंतिम फॉर्म को समाप्त करता है और समाप्त होता है जब उपयोगकर्ता अंतिम पृष्ठ पर समाप्त होता है?

उत्तर

5

आप जो देख रहे हैं वह acts_as_state_machine gem है। यदि आप राज्य मशीनों से अपरिचित हैं, तो here देखें।

1

मैं अपने मूल सवाल का जवाब पता नहीं है लेकिन वैसे भी ...

इसके बजाय हर पृष्ठ पर बचत की, क्यों एक सत्र चर में सभी डेटा नहीं बचा? फिर अंत में आपके पास एक पृष्ठ हो सकता है जो सत्र में डेटा को डेटाबेस में सहेजता है? इस तरह आपने डीबी में आंशिक रूप से कुछ भी बचाया नहीं है।

1

मुझे लगता है कि प्रत्येक पृष्ठ को सहेजने में मूल्य है, क्योंकि यदि यह एक लंबी चल रही प्रक्रिया है और उपयोगकर्ता मध्य में बाधित है तो वे अपने मध्यवर्ती, असामान्य परिणामों को सहेजना चाहते हैं और बाद में जहां उन्होंने छोड़ा था वहां उठा सकते हैं।

यदि आपको लगता है कि यह भी एक अच्छा विचार है, तो आपका डिज़ाइन ध्वज संग्रहीत करेगा यह इंगित करने के लिए कि कोई विशेष टुकड़ा लंबे समय से चलने वाले लेनदेन का हिस्सा था जो अभी तक पूरा नहीं हुआ था। अंतिम टुकड़ा पूरा होने पर ध्वज सेट करें और सहेजें बटन मारा गया था। एक टाइमआउट मान दें जो कहता है कि अगर मध्यवर्ती टुकड़े को "अंतिम बचत" अनुमोदन दिया गया था, तो निश्चित अवधि के बाद उन्हें हटा दिया जाएगा।

1

एक डेटाबेस लेनदेन खोलना जो एकाधिक अनुरोधों का विस्तार करेगा, एक बुरा विचार है। उस स्थिति पर विचार करें जहां उपयोगकर्ता आपके लेनदेन से पहले ब्राउज़र को बंद कर देता है। आपको अनाथ लेनदेन के साथ छोड़ दिया गया है जो न तो लुढ़का हुआ है और न ही प्रतिबद्ध है।

बस डेटाबेस में एक झंडा डालें जैसे REG_COMPLETE, जो केवल पंजीकरण प्रक्रिया के अंतिम पृष्ठ पर सेट हो जाता है। फिर आप उस अपूर्ण रिकॉर्ड के साथ जो भी चाहें उसे फ़िल्टर/स्क्रब कर सकते हैं ... शायद उन्हें एक ईमेल भेजकर उन्हें समाप्त करने के लिए प्रेरित कर सकते हैं?

2

विशिष्ट प्रश्न का उत्तर देने के लिए, मुझे नहीं लगता कि डेटाबेस समझ में लेनदेन स्थापित करने का कोई तरीका है जो आप चाहते हैं। इसके बारे में सोचें और आप देखेंगे क्यों: इस बात की कोई गारंटी नहीं है कि आपके बहु-पृष्ठ संचालन के विभिन्न हिस्सों को एक ही प्रक्रिया द्वारा संभाला जाएगा। या यहां तक ​​कि एक ही सर्वर की संभावना है। यदि अनुरोध डेटाबेस कनेक्शन को फैलाता है, क्योंकि यह इस स्थिति में होगा, तो एक कनेक्शन से अपरिचित हिस्सों को अन्य कनेक्शनों के लिए अदृश्य कर दिया जाएगा।

साथ ही विचारों का पहले से ही उल्लेख किया गया है, तो मैं पहले से दर्ज अपूर्ण डेटा को पकड़ने के लिए एक या अधिक "स्टेजिंग" टेबल का उपयोग करने पर विचार करता हूं। फिर जब उपयोगकर्ता समाप्त हो जाता है, तो एक लेनदेन स्थायी तालिका में डेटा लागू कर सकता है और स्टेजिंग डेटा को हटा सकता है। एक बार जब आप विश्वास कर लें कि सत्र समाप्त हो गया है, या उपयोगकर्ता द्वारा लौटाए जाने तक आयोजित किया जाता है, तो पृष्ठभूमि प्रक्रिया द्वारा आयु मानदंड पर अधूरा डेटा साफ़ किया जा सकता है, क्या यह आपकी आवश्यकताओं को बेहतर ढंग से पूरा करना चाहिए।

मैं इस दृष्टिकोण की तरफ झुकता हूं, खासकर अगर मुझे नियमित अपूर्ण लेनदेन होने की उम्मीद है, क्योंकि इस तरह मुझे अपने मुख्य मॉडल में अपूर्ण डेटा से निपटने की ज़रूरत नहीं है।

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