2011-03-30 24 views
9

पर टैगिंग सिस्टम कैसे बनाएं, मैं यहां एक टैगिंग सिस्टम बनाना चाहता हूं जैसे स्टैक ओवरफ़्लो या क्वारा पर देखा गया। यह अपना खुद का मॉडल होगा, और मैं उपयोगकर्ताओं को टैग खोजने में सहायता के लिए this autocomplete plugin का उपयोग करने की योजना बना रहा हूं। मेरे पास कुछ प्रश्न हैं:स्टैक ओवरफ़्लो या क्वारा

  1. मैं टैग पूरी तरह से उपयोगकर्ता द्वारा उत्पन्न होना चाहता हूं। यदि कोई उपयोगकर्ता इसे टाइप करके और "जोड़ें" बटन दबाकर एक नया टैग इनपुट करता है, तो वह टैग डीबी में जोड़ा जाता है, लेकिन यदि कोई उपयोगकर्ता मौजूदा टैग में टाइप करता है, तो यह उस का उपयोग करता है। मैं इस तरह के कोड का उपयोग करने के बारे में सोच रहा हूं:

    def create 
    
    @video.tags = find_or_create_by_name(@video.tags.name) 
    
    end 
    

    क्या मैं सही रास्ते पर हूं?

  2. मैं स्टैक ओवरफ़्लो या क्वारा जैसे कुछ को कार्यान्वित करना चाहता हूं जैसे कि जब आप सुझाई गई सूची से किसी टैग पर क्लिक करते हैं या "जोड़ें" बटन पर क्लिक करते हैं, तो वह टैग AJAX के साथ टेक्स्ट फ़ील्ड के ठीक ऊपर जोड़ा जाता है। मैं ऐसा कुछ करने के बारे में कैसे जाउंगा?

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

नोट मैं jQuery स्वत: पूर्ण प्लगइन को कैसे सेट अप करने के लिए मदद नहीं मांग रहा हूं ... मुझे पता है कि यह कैसे करें। इसके बजाय, ऐसा लगता है कि मुझे प्लगइन में कोड को संशोधित करना होगा ताकि टेक्स्ट फ़ील्ड के अंदर टैग जोड़ने के बजाय, वे टेक्स्ट फ़ील्ड के ऊपर जोड़े गए हों। मैं इसके साथ किसी भी दिशा की सराहना करता हूं।

+0

मैं [stemming] (http://en.wikipedia.org/wiki/Stemming) सहित अनुशंसा करता हूं ताकि उदाहरण के लिए "तैरना" और "तैराकी" एक ही टैग पर मैप किया जाएगा। –

+0

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

+0

मैंने रूबी में कोई भी स्टेमिंग नहीं किया है लेकिन "रूबी स्टेमर" गुगल करने के कुछ विकल्प प्रदान करते हैं। यदि आप देखना चाहते हैं कि कोई मौजूदा समाधान कैसे काम करता है तो आप "act_as_taggable" पर भी एक नज़र रखना चाहेंगे। –

उत्तर

11

mbleigh's acts_as_taggable_on gem एक सुविधा-पूर्ण समाधान है जिसे आपको निश्चित रूप से थोड़ा और बारीकी से देखना चाहिए। कार्यान्वयन रॉक-ठोस और उपयोग करने के लिए लचीला है। हालांकि, यह ज्यादातर वस्तुओं को टैग संलग्न करने, वस्तुओं पर टैग पुनर्प्राप्त करने और टैग किए गए आइटमों की खोज करने से संबंधित है। यह सभी बैकएंड सर्वर सामान है।

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

  1. उपयोगकर्ता एक नया टैग आदानों हैं, कि टैग जुड़ जाता है, उपयोगकर्ता एक मौजूदा टैग आदानों अगर, मौजूदा टैग इस्तेमाल किया जाता है। act_as_taggable_on यह करता है।
  2. सुझाए गए सूची से एक टैग पर क्लिक करें उस टैग को जोड़ें। यह कार्यान्वयन समस्या है - बैक-एंड पर आपको टैग की सुझाई गई सूची एकत्र करने की आवश्यकता होगी, फिर अपने प्रस्तुति समारोह में को अपनी प्रस्तुति में के रूप में प्रदर्शित करें।
  3. उपयोगकर्ता के रूप में स्वत: पूर्ण संभावित टैग में प्रवेश करता है। टैग तालिका को खींचने वाली वस्तुओं की सूची की सूची के विरुद्ध आप jQuery स्वत: पूर्ण प्लगइन का उपयोग करेंगे। अतिरिक्त jQuery के साथ, आप कैप्चर कर सकते हैं जब उन्होंने विकल्पों में से एक का चयन किया है, या अपना नया टैग दर्ज कर लिया है, और फिर प्रोसेसिंग फ़ंक्शन को कॉल करें।
  4. उपयोगकर्ताओं को केवल एक टैग दर्ज करने के लिए प्रतिबंधित करें। यह आपका यूआई कार्यान्वयन होगा - एक बार उनके पास दर्ज किया गया है या टैग का चयन किया गया है, तो आप इसे संसाधित करते हैं।यदि वे दो शब्द को अल्पविराम से अलग करते हैं, तो पहले या प्रसंस्करण के दौरान आपको को एक टैग के रूप में व्यवहार करना होगा, या केवल ले लें, पहले कॉमा तक टेक्स्ट और बाकी को छोड़ दें।
  5. जब आप टैग को जोड़ने की प्रक्रिया करते हैं, तो आपको दो चीजें करना होगा। सबसे पहले, आपको यूआई डिस्प्ले परिवर्तनों को प्रदर्शित करने की आवश्यकता होगी ताकि यह दर्शाया जा सके कि टैग दर्ज/चुना गया है। यह दूसरा "seleted" क्षेत्र में टैग डालने से, "उपलब्ध" प्रदर्शन से इसे हटाने के लिए, किसी भी काउंटरों को अद्यतन करने, आदि शामिल हैं, तो आप को सर्वर के लिए एक अनुरोध भेजने के लिए की आवश्यकता होगी वास्तव में जोड़ने ऑब्जेक्ट पर टैग करें और उस तथ्य को डेटाबेस पर रखें (जहां टैग करने योग्य मणि आपके लिए ले जाएगा)। आप या तो प्रति टैग एक व्यक्तिगत AJAX अनुरोध के माध्यम से ऐसा कर सकते हैं, या जब आप फ़ॉर्म सबमिट करते हैं तो आप इसे संभाल सकते हैं। यदि उत्तरार्द्ध, आपको टैग की चलती सूची रखने के लिए की आवश्यकता होगी जो को जोड़ा/हटा दिया गया है और आपको को उस var में मान जोड़ने/हटाने के लिए कोड की आवश्यकता होगी।

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

जैसा कि आप देख सकते हैं, इनमें से अधिकतर आपको निर्धारित करने और कोड करने के लिए है, लेकिन बैकएंड भाग के साथ बहुत कम करना है। मणि आपके लिए काफी अच्छी तरह से देखभाल करेगा।

मुझे आशा है कि इससे आपको सही दिशा में आगे बढ़ने में मदद मिलेगी।

+0

मैं यह पता लगाने की कोशिश कर रहा हूं कि इस मणि के साथ एसओ-स्टाइल टैगिंग कैसे करें - https://github.com/mbleigh/acts-as-taggable-on/issues/851#issuecomment-320332246 –

0

जितना अधिक मैं forceacts-as-taggable-on मणि को और अधिक काम करने की कोशिश करता हूं, मुझे लगता है कि ये मौलिक रूप से विभिन्न प्रकार की समस्याएं हैं। विशेष रूप से उपनामों के कारण। मणि प्रत्येक टैग को अपने विशेष हिमपात के रूप में मानता है, जिससे समानार्थी बनाना मुश्किल हो जाता है। कुछ मामलों में यह बहुत दूर नहीं जाता है, अगर आप टैग को एक विवरण देना चाहते हैं तो आपको दिए गए माइग्रेशन को संपादित करने की आवश्यकता होगी (जो करना मुश्किल नहीं है)।

यहां मैं क्या लागू कर रहा हूं, given the trouble I've had implementing via the gem। आइए मान लें कि आप टेक्नोलॉजीज के लिए टैगिंग सिस्टम बनाना चाहते हैं।

निम्नलिखित psuedo कोड पर विचार करें, मैंने अभी तक इसका परीक्षण नहीं किया है।

rails g model Tech usage_count::integer description:text icon_url:string आदि माइग्रेशन चलाएं। नोट करें

अब नियंत्रक में आपको प्रत्येक बार कुछ होने पर उपयोग_count बढ़ाने की आवश्यकता होगी, उपयोगकर्ता दिए गए पाठ के साथ टैग किया गया एक नया प्रश्न सबमिट करता है।

search = Name::Tech.where("name LIKE :prefix", prefix: "word_start%") 
.joins(:tech) 
.order(usage_count: desc) 
.limit(5) 

यह शुरू हो रहा है बिंदु:

rails g model Name::Tech belongs_to:Tech name:string

Name::Tech model 
    belongs_to :tech 
end 

तो फिर तुम जैसे कुछ के माध्यम से खोज सकते हैं। यह मूल रूप से मणि से अलग है, क्योंकि प्रत्येक टैग केवल अपने आप पर एक स्ट्रिंग है, लेकिन बैक एंड पर एक समृद्ध डेटा तालिका का संदर्भ देता है।मैं कार्यान्वयन पर काम करूंगा और एक बेहतर समाधान के साथ अद्यतन करने के लिए वापस आऊंगा।

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