2017-01-28 5 views
11

मुझे यकीन है कि मुझे कुछ याद आ रहा है लेकिन मुझे किताबों की दुकान एपीआई को लगातार मेरे लिए भ्रमित करने के लिए मिल गया है। , दो क्षेत्रों example1 और example2 नामितमैं Bookshelf.js के साथ मॉडल को सही तरीके से कैसे अपडेट करूं?

  • मैं एक मॉडल एक आवेदन से सौंपा स्ट्रिंग प्राथमिक serial नामित कुंजी के साथ Radio और कहा जाता है, इस उदाहरण के प्रयोजन के लिए है: यहाँ मैं क्या करने की कोशिश कर रहा हूँ है। मैंने मॉडल परिभाषा में idAttribute: 'serial' के साथ कस्टम आईडी निर्दिष्ट की है।
  • मैं बुक्सहेल्फ़ के साथ एक अपरिवर्तनीय प्रदर्शन करने की कोशिश कर रहा हूं (सीधे मेरे वास्तविक अनुप्रयोग में, कन्क्स के साथ नहीं, यह क्वेरी जटिल हो जाती है)।
  • मुझे मिला है केस काम कर रहा है लेकिन अद्यतन करने के लिए प्रतीत नहीं होता है।
  • सादगी के लिए मैं अभी लेनदेन या परमाणुता की परवाह नहीं कर रहा हूं। मैं एक आसान प्राप्त करने के लिए संतुष्ट हूं → को काम करने के लिए डालें/अपडेट करें।

और विशेष रूप से इस उदाहरण में:

  • डालने पर example1 और example2 निर्धारित किया है।
  • अद्यतन पर example1 सेट करें और example2 अपरिवर्तित छोड़ दें।

तो मैं बुकशेल्फ मॉडल में कुछ इस तरह मिल गया है, एक वर्ग के रूप (यानी "स्थिर") विधि ("जानकारी" क्षेत्रों "धारावाहिक", "example1", और "example2" है):

insertOrUpdate: function (info) { 
    return new Radio({'serial':info.serial}).fetch().then(function (model) { 
     if (model) { 
      model.set('example1', info.example1); 
      return model.save({}, { 
       method: 'update', 
       patch: true 
      }) 
     } else { 
      return new Radio({ 
       serial: info.serial, 
       example1: info.example1, 
       example2: info.example2 
      }).save({}, { 
       method: 'insert' 
      }) 
     } 
    }).then(function (model) { 
     console.log("SUCCESS"); 
    }).catch(function (err) { 
     console.log("ERROR", err); 
    }); 
} 

उदाहरण कॉल:

Radio.insertOrUpdate({ 
    serial: ..., 
    example1: ..., 
    example2: ... 
}) 

समस्या मैं में यहाँ चल रहा हूँ कि जब तक "सम्मिलित" मामले से काम करता है, "अद्यतन" मामले के साथ विफल है:

ERROR { Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where `serial` = '123223'' at line 1 

कौन सा Knex डिबगिंग के साथ स्पष्ट है, चालू जहां उत्पन्न क्वेरी set खंड याद आ रही है:

update `radios` set where `serial` = ? 

अब, मैं fetch और save के लिए बुकशेल्फ डॉक्स पर ध्यान केंद्रित कर रहा हूँ, और मैं सोच रहा हूँ अगर मैं गलत दिशा में नेतृत्व कर रहा हूँ।

मुझे पता है कि मैं एपीआई गलत का उपयोग कर रहा हूं लेकिन मैं इसे समझ नहीं सकता।

  • मैं save के पहले पैरामीटर समझ में नहीं आता: अजीब बातें मैंने देखा की एक जोड़े/वह अपने अर्द्ध काम कर रहे राज्य में प्राप्त करने के लिए अभी करना था। यह मुझे समझ में आता है अगर स्थिरModel की विधि थी, लेकिन यह नहीं है। यह एक उदाहरण विधि है और आप Model कन्स्ट्रक्टर (उदा। new X(a:1).save({a:2}) मतलब ...?) पर विशेषताओं को पहले से ही पास कर सकते हैं, और आप सहेजने से पहले set के साथ विशेषताओं को सेट कर सकते हैं। तो मैं इसका एहसास नहीं कर सकता।मुझे विकल्प निर्दिष्ट करने के लिए प्लेसहोल्डर के रूप में {} पास करना पड़ा।

  • इस forge चीज नहीं है लेकिन मुझे यकीन है कि क्या अपने उद्देश्य है, क्योंकि आप पहले से ही Model निर्माता (जब तक कि लेखकों X.forge({a:1}) बनाम new X({a:1}) ...? को कुछ लाभ पाया जाता है) के लिए गुण पारित कर सकते हैं नहीं कर रहा हूँ।

  • मैंने पाया कि मैं स्पष्ट रूप से एक स्पष्ट बुकशेल्फ मोड़ की वजह से बचाने के लिए विधि निर्दिष्ट करने के लिए किया था: बुकशेल्फ isNew() पर विधि की अपनी पसंद के आधार है, लेकिन isNew() हमेशा true है जब आप मॉडल निर्माता, करने के लिए आईडी पारित आप जो आवेदन-निर्दिष्ट आईडी मामले में करना है। इसलिए आवेदन-निर्दिष्ट आईडी के लिए बुकशेल्फ़ हमेशा एक "डालने" करेगा क्योंकि हमेशा मॉडल "नया है" सोचता है। तो आपको विधि को "अपडेट" करने के लिए मजबूर करना होगा ... यह सिर्फ मेरे बुकशेल्फ़ भ्रम में जोड़ता है।

वैसे भी, मैं इसे ठीक से कैसे कर सकता हूं? मैं इसे कैसे सम्मिलित और अद्यतन कर सकता हूं?

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

+1

'.save ({}, विकल्प) 'भेजकर, आप स्पष्ट रूप से बुकशेल्फ़ को एक खाली अपडेट ऑब्जेक्ट भेज रहे हैं। क्या आप इसके बजाय 'शून्य' के साथ प्रयास कर सकते हैं? अर्थात। '.save (शून्य, विकल्प)' – DeadEye

उत्तर

3

यह एक दिलचस्प था और मुझे यह समझने में कुछ समय लगा कि क्या हो रहा था।

आप लग रहे हैं के रूप में, पता चला है, save() विधि patch विकल्प के बारे में documentation कहा गया है कि यह

केवल तर्क को बचाने के लिए आपूर्ति की विशेषताओं को बचाने के।

तो आप बस

if (model) { 
    model.set('example1', info.example1); 
    return model.save(); 
} 

करने के लिए अपने कोड बदलने की जरूरत है और set गुण सहेज लिया जाएगा।

लेकिनलेकिनलेकिनलेकिन

सभी विशेषताओं update बयान में भी id मिल जाएगा!

यह ओआरएम के लिए एक आम व्यवहार है, इसका तर्क यह है कि अगर हमें एक लेनदेन से डेटा मिला और किसी अन्य (बुरे, बुरे अभ्यास!) से बचत हो रही है, तो डेटा किसी अन्य ग्राहक द्वारा बदला जा सकता है। इसलिए गुणों का केवल एक हिस्सा सहेजने से असंगत स्थिति हो सकती है।

लेकिन patch विशेषता का अस्तित्व इस अवधारणा का उल्लंघन करता है। तो बुकशेल्फ़ द्वारा सुधार किया जा सकता है:

  • बस patch विकल्प को हटा रहा है। (मैं इसे पसंद कर सकता हूं)
  • चूंकि बुकशेल्फ़ मॉडल बदले गए गुणों का ट्रैक रखता है, मुझे लगता है कि इस संबंध में अद्यतनों को बेहतर बनाने के लिए यह छोटा होना चाहिए। यह परिवर्तन patch विकल्प के बहिष्करण के लिए भी नेतृत्व कर सकता है।
  • एक और दृष्टिकोण patch सेमेन्टिक्स बदल सकता है बजाय save() पर दिए गए लोगों के बदले में परिवर्तित गुणों से संबंधित है। लेकिन इस तरह के बदलाव दुर्भाग्यवश कुछ उपयोग मामलों को तोड़ सकता है।
  • या आखिर में नए विकल्प को सभी बदले गए गुणों पर कार्य करने का विकल्प पेश करना। लेकिन यह गन्दा लगता है।
+0

ठीक है। एक नज़र में, यह समझ में आता है। यह परियोजना पिछले हफ्ते बैक बर्नर पर गई थी लेकिन यह फिर से अग्रभूमि में वापस आ गई है। मैं कल कुछ और विचार देने जा रहा हूं जब मैं वापस खोदता हूं। –

1

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

  • अपनी पहली पैरामीटर के रूप में save के लिए गुण दर्रा, बल्कि उन्हें set साथ स्थापित करने से:

    असल में मैं इसे करने के लिए "अद्यतन" मामले को संशोधित करके काम करने के लिए प्राप्त करने में सक्षम था।

के अंतिम समाधान के लिए अग्रणी:

insertOrUpdate: function (info) { 
    return new Radio({'serial':info.serial}).fetch().then(function (model) { 
     if (model) { 
      // pass params to save instead of set() 
      var params = { 'example1' : info.example1 } 
      return model.save(params, { 
       method: 'update', 
       patch: true 
      }) 
     } else { 
      return new Radio({ 
       serial: info.serial, 
       example1: info.example1, 
       example2: info.example2 
      }).save({}, { 
       method: 'insert' 
      }) 
     } 
    }).then(function (model) { 
     console.log("SUCCESS"); 
    }).catch(function (err) { 
     console.log("ERROR", err); 
    }); 
} 

मैं अभी भी यकीन नहीं है कि कैसे/forge या यहाँ में फिट बैठता है, तो क्या सौदा "सम्मिलित" में save करने के लिए पहले पैरामीटर के साथ किया जाना चाहिए मामला।

अधिक महत्वपूर्ण बात यह है कि, मुझे पूरी तरह से यकीन नहीं है कि set अब के लिए क्या है। ओआरएम ढांचे के मुख्य लाभों में से एक माना जाता है उस प्रकार की सामग्री पारदर्शी बनाने के लिए (यानी "सेव" सही तरीके से काम करता है, जबकि आप इसके बारे में सोचने के बिना मॉडल का उपयोग करते हैं, और आपको बिना किसी बदलाव के ज्ञान प्राप्त करना पड़ता है जिस बिंदु पर आप "सेव" करते हैं - I अज्ञात मनमानी कोड set समय से पहले चीजें करने में सक्षम हो, तो यह जानने के बिना इसे सहेजने में सक्षम हो, लेकिन ऐसा लगता है कि मैं नहीं कर सकता), इसलिए मैं हूं यकीन नहीं है कि मैंने वास्तव में बुक्सहेल्फ़ से क्या हासिल किया है। एक बेहतर दृष्टिकोण होना चाहिए।

+0

मैं अब इस अस्वीकार्य को छोड़ने जा रहा हूं क्योंकि मुझे अभी भी विश्वास नहीं है कि यह सही दृष्टिकोण है। मुझे लगता है कि 'save' 'set' के साथ सही तरीके से काम करने में सक्षम होना चाहिए। –

+1

यह आपके प्रश्न का उत्तर नहीं देता है, लेकिन मुझे इसमें प्रवेश करना पड़ा। मैं mysql के लिए ओआरएम के रूप में 'objection.js' का उपयोग करता हूं और इसके साथ काम करना एक खुशी है। बुकशेल्फ़ की तरह, यह 'knex' के शीर्ष पर भी बनाया गया है। दस्तावेज बहुत अच्छा है और, बोनस के रूप में, 'अपरर्ट' विधि बनाने का एक उदाहरण है। इसके अलावा, जो व्यक्ति लिखा और रखता है वह गिटार और गिथब पृष्ठों पर त्वरित और पूरी तरह से सवालों का जवाब देता है। बस एक विचार ... –

+0

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

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