2016-09-29 30 views
10

में तत्वों को कैसे अक्षम करें मेरे पास कई ग्रिड हैं जो किसी दिए गए फ़िल्टर (एक आरईएसटी एपीआई का उपयोग कर वेब एप्लिकेशन में) के आधार पर डेटा प्रदर्शित करते हैं। प्रदर्शित डेटा संरचना हमेशा समान होती है (समस्या को सरल बनाने के लिए), लेकिन जिस स्क्रीन पर उपयोगकर्ता है, उसके आधार पर प्रदर्शित परिणाम अलग-अलग होते हैं।ग्रिड

इसके अलावा, और यह मुद्दा है, कुछ परिणाम अक्षम होना चाहिए ताकि उपयोगकर्ता उन्हें चुन सकें।

उदाहरण: एक फू में एन बार्स हैं। अगर मैं पिता (फू) में एक नया बच्चा (बार) जोड़ना चाहता हूं, तो मैं खोज स्क्रीन पर जाता हूं, लेकिन मैं चाहता हूं कि फ़िल्टर किए गए ग्रिड विकलांग बच्चों के रूप में दिखाए जाएं जो पहले से ही पिता से संबंधित हैं।

वर्तमान में मैं द्वारा सर्वर (डेटाबेस क्वेरी) पर इस समस्या को नियंत्रित कर रहा हूं, परिदृश्य और "अक्षम करने" परिणामों के आधार पर विशिष्टता में शामिल है। लेकिन इस दृष्टिकोण से मैं प्रश्नों का पुन: उपयोग नहीं कर सकता (विनिर्देशों के कारण जुड़ता है। शायद मुझे बार्स इंट ऑर्डर को अन्य पिता बाज़ से जोड़ने की ज़रूरत है, और मैं उन बार्स को अक्षम करना चाहता हूं जो पहले से ही मौजूदा पिता से संबंधित हैं ...)

अन्य दृष्टिकोण निम्नलिखित हो सकता है:

  • सहेजें बच्चों (केवल आईडी) स्मृति (जावास्क्रिप्ट)
  • में एक सरणी में पिता से संबंधित "प्रीरेंडर" ग्रिड घटना (या समान) प्रत्येक तत्व है कि क्या के लिए जाँच में यह पिछले सरणी में है या नहीं (आईडी द्वारा खोज)। यदि ऐसा है, तो इसे अक्षम के रूप में चिह्नित करें (उदाहरण के लिए)। यह क्लाइंट-साइड में एक पुन: प्रयोज्य समाधान है और मैं हमेशा सर्वर की तरफ एक ही क्वेरी का पुन: उपयोग कर सकता हूं।

इस समाधान को लागू करने से पहले मैं जानना चाहता हूं कि कोई बेहतर विकल्प है या नहीं। मुझे यकीन है कि यह एक आवर्ती समस्या है और मैं पहिया को फिर से शुरू नहीं करना चाहता हूं।

कोई रणनीति या सुझाव?

संपादित करें: शो उदाहरण:

इस मॉडल मानते हुए:

Category N:M Item 
SalesPromotion N:M Item 

मैं दो अलग अलग स्क्रीन हैं: एक दिखा आइटम एक श्रेणी के अंतर्गत आता और एक अन्य दिखा आइटम एक बिक्री संवर्धन के अंतर्गत आता है। प्रत्येक स्क्रीन में मैं वस्तुओं की खोज कर सकता हूं और उन्हें श्रेणी या SalesPromotion में जोड़ सकता हूं। लेकिन जब मैं वस्तुओं को खोज रहा हूं, तो मैं उन वस्तुओं को चाहता हूं जो पहले से ही श्रेणी/बिक्री प्रमोशन से संबंधित हैं (या इस उदाहरण में सादगी के लिए दिखाए गए) को दिखाने के लिए। मैं सर्वर में ऐसा कर सकते हैं, इस तरह के प्रश्नों कर:

-- Query for search Items in Category screen 
SELECT * FROM ITEMS i 
LEFT JOIN ItemsCategories ic on ic.ItemId = i.ItemId 
WHERE ic.CategoryId IS NULL OR ic.CategoryId <> @CurrentCategoryId 

-- Query for search Items in SalesPromotion screen 
SELECT * FROM ITEMS i 
LEFT JOIN ItemsSalesPromotions isp on isp.ItemId= i.ItemId 
WHERE isp.PromotionId IS NULL OR isp.PromotionId <> @CurrentPromotionId 

आप कल्पना कर सकते क्या हुआ अगर मैं इस तरह के अधिक से अधिक परिदृश्यों था होता है (और अधिक जटिल मॉडल और निश्चित रूप से प्रश्नों के साथ)।

एक विकल्प हो सकता है:

  • स्टोर आइटम कि पहले से ही स्मृति में वर्तमान श्रेणी/SalesPromotion (जावास्क्रिप्ट, clientside) के अंतर्गत आता है।
  • क्लाइंटसाइड में ग्रिड प्रीरेंडर ईवेंट (या समतुल्य) पर निर्धारित करें कि कौन से आइटम अक्षम किए जाने चाहिए (संग्रहीत वस्तुओं में प्रत्येक पंक्ति को खोजकर)।

तो, मेरा सवाल यह है कि यह दृष्टिकोण एक अच्छा समाधान है या इस मुद्दे के लिए एक प्रसिद्ध समाधान है (मुझे ऐसा लगता है)।

+0

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

+1

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

+0

@Mightee वर्तमान में मैं इस तरह से ऐसा कर रहा हूं: फ़िल्टर विकल्प भेजना और सर्वर में पूछताछ करना। लेकिन इस तरह मेरे पास कई अलग-अलग प्रश्न हैं। मैं एक प्रश्न पूछना चाहता हूं और विभिन्न परिदृश्यों में इसका पुन: उपयोग करना चाहता हूं। और यही कारण है कि मैं क्लाइंट साइड में आइटम अक्षम करना चाहता हूं। उदाहरण के लिए मैं अपना प्रश्न संपादित करूंगा –

उत्तर

6

मैं सेशन की टिप्पणी के आधार पर मेरा उत्तर बदल

तो आप मूल रूप से दो विकल्प यहाँ है।

  1. डीबी से पूछने के बाद आईडी सर्वर सर्वर को हटा दें। (प्रतिक्रिया प्रदर्शन को प्रभावित करता है लेकिन सुरक्षित)।
  2. इसे जेएस के साथ क्लाइंट साइड पर करें और उन्हें ग्रिड से हटा दें।
+0

मुझे यह पसंद नहीं है क्योंकि "आईडी सूची" बड़ी हो सकती है –

+0

विकल्प 2 वह दृष्टिकोण है जिसे मैं बेहतर समाधान नहीं पा रहा हूं –

3

आपके SELECT एस में, LEFT JOIN हिस्सा बेकार है। आपका WHERE क्लॉज केवल ITEMS तालिका का उपयोग करता है, इसलिए इसका उपयोग पंक्तियों के सेट पर कोई प्रभाव नहीं पड़ता है, और चूंकि अन्य तालिका में कोई संबंधित पंक्ति नहीं है, इसलिए इस अन्य तालिका के लिए कॉलम सभी NULL हैं।

आप इस प्रकार एक भी SELECT * FROM ITEMS i (+ फिल्टर) है और CategoryId, PromotionId के आधार पर अपने यूआई, आदि कॉलम जा रहा है NULL समायोजित कर सकते हैं।

+0

आप सही हैं, मैंने नमूना को बढ़ाया है ... मैं इसे संपादित करूंगा। –